bzoj2662 [BeiJing wc2012]冻结 ——分层图
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2662
分层图;
我也不知道我写的是不是 bfs (dijkstra?)。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int n,m,k,head[55],ct,dis[55][55]; bool vis[55][55]; struct N{ int to,next,w; N(int t=0,int n=0,int w=0):to(t),next(n),w(w) {} }edge[2005]; struct P{ int d,f,bh; P(int d=0,int f=0,int b=0):d(d),f(f),bh(b) {} bool operator < (const P &y) const { return d>y.d;//priority_queue 是从大到小排序 } }; priority_queue<P>q; void add(int x,int y,int z){edge[++ct]=N(y,head[x],z); head[x]=ct;} void bfs() { memset(dis,0x3f,sizeof dis); dis[1][0]=0; q.push(P(0,0,1)); while(q.size()) { int x=q.top().bh,d=q.top().d,f=q.top().f; q.pop(); if(vis[x][f])continue; vis[x][f]=1; if(x==n) { printf("%d",d); return; } for(int i=head[x];i;i=edge[i].next) { int u=edge[i].to; if(f<k&&!vis[u][f+1]&&dis[u][f+1]>d+edge[i].w/2) { dis[u][f+1]=d+edge[i].w/2; q.push(P(dis[u][f+1],f+1,u)); } if(dis[u][f]>d+edge[i].w&&!vis[u][f]) { dis[u][f]=d+edge[i].w; q.push(P(dis[u][f],f,u)); } } } } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=1,x,y,z;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } bfs(); return 0; }