Description
Input
Output
Sample Input
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output
Scenario #1: 4
题解:求全部1到n的路径中能运的最大值。用djistra算法,每次找最大的一个,然后更新该点到其它点的最大值。(有的题目是求全部路径中的最大值)。
djistra:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF = 0x3fffffff;
int map[1003][1003];
bool visited[1003];
int d[1003]; //保存1到该点路径中运输量的最大值
int min(int a,int b)
{
return a > b ? b : a;
}
void prim(int n)
{
memset(visited,false,sizeof(visited));
for(int i = 1;i <= n;i++)
{
d[i] = map[1][i];
}
d[1] = INF;
visited[1] = true;
for(int i = 1;i < n;i++)
{
int m = 0;
int k;
for(int j = 1;j <= n;j++)
{
if(!visited[j] && m < d[j]) //每次找到j点运输量最大的一个
{
m = d[j];
k = j;
}
}
if(m == 0)
{
break;
}
visited[k] = true;
for(int j = 1;j <= n;j++)
{
if(!visited[j] && d[j] < map[k][j] && d[j] < d[k])
{ //表示1到j的路径的运输量的最大值被1->k->j代替,由于该路径的大
d[j] = min(d[k],map[k][j]);
}
}
}
}
int main()
{
int ncase;
cin>>ncase;
int t = 1;
while(ncase--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
if(i == j)
{
map[i][j] = INF; //自己运输到自己
}
else
{
map[i][j] = 0;
}
}
}
for(int i = 0;i < m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
map[u][v] = map[v][u] = w;
}
prim(n);
printf("Scenario #%d:\n",t++);
printf("%d\n\n",d[n]);
}
return 0;
}原文:http://www.cnblogs.com/cxchanpin/p/7074126.html