最短路径题目
Posted shirlybaby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径题目相关的知识,希望对你有一定的参考价值。
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: ",ca++); printf("%d ",dp[n]); } return 0; }
以上是关于最短路径题目的主要内容,如果未能解决你的问题,请参考以下文章