POJ 1797 :http://poj.org/problem?id=1797
这题和 基础最短路二 的POJ2253 其实是差不多的
n 为1000
题意:从点1到点n,之间的 最小边 最大为多少。
和POJ 1797 的反一下就好了。但是要更新起来要考虑一下小细节。代码里有注释位置。
结尾要多换一行!!!!
Spfa真好用,上瘾了,还好记:
#include"cstdio" #include"iostream" #include"cstring" #include"algorithm" #include"vector" #include"cmath" #include"queue" using namespace std; #define INF 1000009 #define inf 1009 #define loop(x,y,z) for(x=y;x<z;x++) #define ll long long int n,m,s,g; int book[inf]; int dis[inf]; queue<int>q; struct node { int to,w; node(int i,int j) { to=i; w=j; } }; vector<node>edge[inf]; void init() { int i; loop(i,1,n+1) edge[i].clear(); loop(i,1,n+1) dis[i]=INF; dis[s]=INF; memset(book,0,sizeof book); while(!q.empty())q.pop(); } void Spfa() { q.push(s); book[s]=1; int i; while(!q.empty()) { int u=q.front(); q.pop(); book[u]=0; int len=edge[u].size(); loop(i,0,len) { node& e=edge[u][i]; int gank=min(dis[u],e.w); if(dis[e.to]==INF||dis[e.to]<gank) //虽然和上题反了一下,但是处理要考虑一下INF情况 { dis[e.to]=gank; if(!book[e.to]) { q.push(e.to); book[e.to]=1; } } } } } int main() { int i,j,k,o; int T; scanf("%d",&T); loop(o,1,T+1) { scanf("%d%d",&n,&m); s=1;g=n; init(); while(m--) { scanf("%d%d%d",&i,&j,&k); edge[i].push_back(node(j,k)); edge[j].push_back(node(i,k)); } Spfa(); printf("Scenario #%d:\n",o); printf("%d\n\n",dis[g]); } return 0; }