POJ1797
//思路:使用Dijkstra变形做的
#include <iostream>
#include <stdio.h>
using namespace std;
int n,m;
int num;
int dis[1001][1001]; //存储图的临界矩阵
int d[1001]; //存储最短距离
bool flag[1001]; //存储是否找到了最短路
void Dij()
{
int max;
int v = 0;
flag[1] = true;
d[1] = 0;
for(int i1=2;i1<n+1;++i1)
{
d[i1] = dis[1][i1];
}
for(int i2=2;i2<n+1;++i2) //外层循环,进行n-1循环
{
max = 0;
for(int i3=2;i3<n+1;++i3)
{
if(!flag[i3] && d[i3]>max) //此处与Dijkstra不同,这里找的是最大边
{
max = d[i3];
v = i3;
}
}
flag[v] = true;
for(int i4=2;i4<n+1;++i4)
{
if(!flag[i4])
{
if(dis[v][i4]>max) //如果后面边的权值大于前面边的值,则将后面边的点的距离设置为前面边的权值
{
d[i4] = max;
}
else if(dis[v][i4]>d[i4]) //此处主要是进行初始化,将d[i4]=0的值进行改变
{
d[i4] = dis[v][i4];
}
}
}
}
cout<<"Scenario #"<<num<<":"<<endl
<<d[n]<<endl<<endl; //此处输出的是d[n],不是d[]中的最大值
}
int main()
{
//freopen("1.txt","r",stdin);
int t;
cin>>t;
num = 0;
for(int i1=0;i1<t;++i1)
{
cin>>n>>m;
memset(dis,0,sizeof(dis));//二维数组也可以使用memset进行初始化
memset(d,0,sizeof(d));
memset(flag,0,sizeof(flag));
for(int i2=0;i2<m;++i2)
{
int start,end;
int weight;
cin>>start>>end>>weight;
dis[start][end] = weight;
dis[end][start] = weight;
}
num++;
Dij();
}
//fclose(stdin);
return 0;
}