第一种解题方法:dij变形
//无向图最短路,dij的变形(有点像prim) //题意:从起点1到终点n,找出一条路,该条路的最小负重是最大的 #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<cstdlib> #include<vector> #include<stack> #include<map> using namespace std; typedef long long ll; const int INF=10e8; const int MAXN=1010; int k,maxn; int cost[MAXN][MAXN],lowcost[MAXN]; bool vis[MAXN]; void dij(int n,int st) { for(int i=1;i<=n;i++) lowcost[i]=cost[st][i],vis[i]=0; vis[st]=1; for(int j=1;j<=n;j++) { k=-1,maxn=0; for(int i=1;i<=n;i++) { if(!vis[i]&&lowcost[i]>maxn) { maxn=lowcost[i]; k=i; } } if(k==-1) break; vis[k]=1; for(int i=1;i<=n;i++) if(!vis[i]) { if(cost[k][i]>maxn) lowcost[i]=maxn; else { if(cost[k][i]>lowcost[i]) lowcost[i]=cost[k][i]; } } } } int main() { int t,n,m; scanf("%d",&t); int Case=0; while(t--) { int u,v,w; Case++; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cost[i][j]=0; //important while(m--) { scanf("%d %d %d",&u,&v,&w); cost[u][v]=cost[v][u]=w; } dij(n,1); printf("Scenario #%d: %d ",Case,lowcost[n]); } return 0; }
第二种解题方法:SPFA+邻接表+队列
//无向图最短路,dij的变形(有点像prim) //题意:从起点1到终点n,找出一条路,该条路的最小负重是最大的 #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<cstdlib> #include<vector> #include<queue> #include<stack> #include<map> using namespace std; typedef long long ll; const int INF=10e8; const int MAXN=1010; struct edge { int v,c,next; }E[1000005]; queue<int> q; int k,maxn,Ecou; int lowcost[MAXN],fa[MAXN]; bool vis[MAXN]; int add_edge(int a,int b,int w) { E[Ecou].v=b;E[Ecou].c=w; E[Ecou].next=fa[a]; return Ecou++; } void SPFA(int n,int st) { for(int i=1;i<=n;i++) lowcost[i]=0,vis[i]=0; q.push(st); lowcost[st]=INF,vis[st]=1; while(!q.empty()) { int t=q.front();q.pop(); vis[t]=0; for(int i=fa[t];i;i=E[i].next) { int j=E[i].v; int k=(lowcost[t]<E[i].c)?lowcost[t]:E[i].c; if(k>lowcost[j]) { lowcost[j]=k; if(!vis[j]) { q.push(j); vis[j]=1; } } } } } int main() { int t,n,m; scanf("%d",&t); int Case=0; while(t--) { int a,b,w; Case++; scanf("%d %d",&n,&m); memset(fa,0,sizeof(fa));//important Ecou=1; while(m--) { scanf("%d %d %d",&a,&b,&w); fa[a]=add_edge(a,b,w); fa[b]=add_edge(b,a,w); } SPFA(n,1); printf("Scenario #%d: %d ",Case,lowcost[n]); } return 0; }