题目链接:http://poj.org/problem?id=1797
题意:从路口1运货到路口n,最大的运货重量是多少?题目给出两路口间的最大载重。
思路:j加到s还是接到K下面,取两者的较大者,而使得载重量较大,而接到k下面,载重量是dis[k]和maps[k][j]的较小者。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; #define INF 0x3f3f3f3f int n,m; int maps[1005][1005]; int dis[1005]; bool vis[1005]; void Dijkstra(int s) { memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++) dis[i] = maps[s][i]; dis[s] = INF; vis[s] = true; for(int i=1;i<n;i++) { int k = 0,tmp = 0; for(int j=1;j<=n;j++) { if(vis[j]) continue; if(dis[j]>tmp) { tmp = dis[j]; k = j; } } vis[k] = true; for(int j=1;j<=n;j++) { if(vis[j]) continue; dis[j] = max(dis[j],min(dis[k],maps[k][j])); } } } int main() { int cases; scanf("%d",&cases); for(int k=1;k<=cases;k++) { scanf("%d%d",&n,&m); memset(maps,0,sizeof(maps)); for(int i=0;i<m;i++) { int u,v,c; scanf("%d%d%d",&u,&v,&c); maps[u][v] = maps[v][u] = max(maps[u][v],c); } Dijkstra(1); printf("Scenario #%d: %d ",k,dis[n]); } return 0; }