1797 Heavy Transportation.
//是最短路径的变形:每条路上的是容量,需要对dijkstra进行变形
//现在是:比较路径上载重量的大小,取小者,在所有的小的情况中取一个大的继续拓展
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<stack> #include<cstdio> #include<queue> #include<map> #include<vector> #include<set> using namespace std; const int maxn=1010; const int INF=0x3fffffff; typedef long long LL; //是最短路径的变形:每条路上的是容量,需要对dijkstra进行变形 //现在是:比较路径上载重量的大小,取小者,在所有的小的情况中取一个大的继续拓展 int n,m; int dp[1010]; int vis[1010]; int mp[maxn][maxn]; void dij(int st){ memset(vis,0,sizeof(vis[0])*(n+3)); for(int i=1;i<=n;i++) dp[i]=mp[st][i]; //初始能够的容量 dp[st]=1000000; vis[st]=1; for(int i=1;i<n;i++){ int u=st,temp=0; for(int j=1;j<=n;j++){ if(!vis[j]&&temp<=dp[j]){ //找到最大的 temp=dp[j]; u=j; } } vis[u]=1; if(dp[n]) return; for(int j=1;j<=n;j++){ if(!vis[j]){ dp[j]=max(dp[j],min(dp[u],mp[u][j])); //!!!!!!!!!注意这个 //一种是不走u //一种是走u,但是这样就有限制,所以取小的 } } } } int main(){ int t; int ca=1; scanf("%d",&t); while(t--){ scanf("%d %d",&n,&m); for(int i=1;i<=n;i++){ memset(mp[i],0,sizeof(mp[i][0])*(n+3)); } for(int i=0;i<m;i++){ int x,y,wei; scanf("%d %d %d",&x,&y,&wei); mp[x][y]=mp[y][x]=max(wei,mp[x][y]); } dij(1); printf("Scenario #%d:\n",ca++); printf("%d\n\n",dp[n]); } return 0; }
原文地址:https://www.cnblogs.com/shirlybaby/p/12547580.html
时间: 2024-10-12 12:24:58