首页 > 代码库 > BZOJ 2662 冻结
BZOJ 2662 冻结
分层图最短路。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#define maxk 55#define maxv 5050#define maxe 5000050#define inf 2147483647using namespace std;int n,m,k,x,y,z,v[maxk][maxk],tot=0,dis[maxv],g[maxv],nume=0,ans=inf;bool vis[maxv];struct edge{ int v,w,nxt;}e[maxe];queue <int> q;void addedge(int u,int v,int w){ e[++nume].v=v; e[nume].w=w; e[nume].nxt=g[u]; g[u]=nume;}void spfa(){ while (!q.empty()) q.pop(); for (int i=1;i<=tot;i++) dis[i]=inf; dis[1]=0;q.push(1);vis[1]=true; while (!q.empty()) { int head=q.front();q.pop(); for (int i=g[head];i;i=e[i].nxt) { int v=e[i].v; if (dis[v]>dis[head]+e[i].w) { dis[v]=dis[head]+e[i].w; if (!vis[v]) { vis[v]=true; q.push(v); } } } vis[head]=false; }}int main(){ scanf("%d%d%d",&n,&m,&k); for (int i=1;i<=n;i++) for (int j=k;j>=0;j--) v[i][j]=++tot; for (int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); for (int j=k;j>=0;j--) { addedge(v[x][j],v[y][j],z); addedge(v[y][j],v[x][j],z); } for (int j=k;j>=1;j--) { addedge(v[x][j],v[y][j-1],z/2); addedge(v[y][j],v[x][j-1],z/2); } } spfa(); for (int i=k;i>=0;i--) ans=min(ans,dis[v[n][i]]); printf("%d\n",ans); return 0;}
BZOJ 2662 冻结
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。