题意:N个城市,M条街道,求出货车通过的最大载重量
思路:用dijkstra算法求最短路 松弛过程(例如 A到B 可经过C再到B )中保证 A到C 和 C到B 权值都大于 A到B 那么取其中较小的 否则取A到B
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define MAXN 1200
#define INF 200000000
using namespace std;
int map[MAXN][MAXN];
bool vis[MAXN];
int d[MAXN];
int n,m;
void dijstra()
{
int now,minx;
for(int i = 1; i <= n; i++)
{
d[i] = map[1][i];
}
vis[1] = true;
for(int i = 1; i <= n-1; i++)
{
minx = 0;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && d[j] > minx)
{
minx = d[j];
now = j;
}
}
vis[now] = 1;
for(int j = 1; j <= n; j++)
{
if(!vis[j] && map[now][j]>d[j]&&d[now]>d[j])
d[j] = min(d[now],map[now][j]);
}
}
}
int main()
{
int T;
int ant = 1;
scanf("%d",&T);
while( T -- )
{
scanf("%d%d",&n,&m);
memset(map,0,sizeof(map));
for(int i = 0; i < m; i++)
{
int x,y,len;
scanf("%d%d%d",&x,&y,&len);
map[x][y] = map[y][x] = len;
}
memset(vis,0,sizeof(vis));
for(int i = 1; i <= n; i++)
{
d[i] = INF;
}
dijstra();
printf("Scenario #%d:\n",ant ++);
printf("%d\n\n",d[n]);
}
return 0;
}