与2253相似,这道题求起点到终点的各条通路中,权值最小边的最大值 Floyd与Dijkstra都可以做 代码: #include<iostream> #include<map> #include<string> using namespace std; int g[201][201],d[201],u[201]; int n,r; int max(int a,int b) { return a>b?a:b; } int min(int a,int b) { return a<b?a:b; } void init() { int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(i!=j) { g[i][j]=-1; } } int main() { int i,j,k,cnt,st,end,w,a,b,t,test=0,mina; char name1[50],name2[50]; while(cin>>n>>r&&n&&r) { test++; memset(g,0,sizeof(g)); memset(d,0,sizeof(d)); memset(u,0,sizeof(u)); cnt=0; map<string,int>mp; init(); while(r--) { cin>>name1>>name2>>w; a=mp[name1]; if(!a) { a=++cnt; mp[name1]=a; } b=mp[name2]; if(!b) { b=++cnt; mp[name2]=b; } g[a][b]=g[b][a]=w; } cin>>name1>>name2; st=mp[name1]; end=mp[name2]; /*for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(g[i][k]&&g[k][j]) { t=min(g[i][k],g[k][j]); g[i][j]=max(g[i][j],t); } }*/ for(i=1;i<=n;i++) { if(g[st][i]>0) d[i]=g[st][i]; else d[i]=-1; } d[st]=0; u[st]=1; for(j=1;j<n;j++) { mina=999999; for(i=1;i<=n;i++) { if(d[i]<mina&&!u[i]&&d[i]>0) { mina=d[i]; k=i; } } u[k]=1; for(i=1;i<=n;i++) { if(g[k][i]>0) { t=min(d[k],g[k][i]); d[i]=max(t,d[i]); } } } cout<<"Scenario #"<<test<<endl; cout<<d[end]<<" tons"<<endl<<endl; } return 0; }