刚做完2253就做这题了。。和2253基本一样Dijkstra的变形,可以用dfs写,试了一下,但是好像又写了个最短路的递归版....
Dijkstra变形的时候注意找的是最大路径。虽然大致代码都自己编出来了,但是还是有好多细节没把握好,没能1a过。
#include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; #define N 1000000 int map[1010][1010]; int n,m; int lowcost[1010]; int vis[1010]; int Nn; void Dijkstra() { int i,j,k,maxt; int start=1; for(i=1;i<=n;i++) map[i][i]=N; for(i=1;i<=n;i++) lowcost[i]=map[start][i]; vis[start]=true; for(i=1;i<=n;i++) //m条边 { maxt=0; for(j=1;j<=n;j++) { if((maxt<lowcost[j])&&!vis[j]) //变形,找最大值 { maxt=lowcost[j]; k=j; } } vis[k]=true; for(j=1;j<=n;j++) if(!vis[j]&&lowcost[j]<min(lowcost[k],map[k][j])) { lowcost[j]=min(lowcost[k],map[k][j]); } } } void input() { int weight,i,j,x,y; cin>>n>>m; memset(map,0,sizeof(map)); memset(lowcost,0,sizeof(lowcost)); memset(vis,0,sizeof(lowcost)); for(i=1;i<=m;i++) //邻接矩阵的输入 { cin>>x>>y;cin>>weight; map[x][y]=weight; map[y][x]=weight; } } int main() { int T; cin>>T; Nn=0; while(T--) { Nn++; input(); Dijkstra(); cout<<"Scenario #"<<Nn<<":"<<endl; cout<<lowcost[n]<<endl; if(T) cout<<endl; } return 0; }