poj 1797 Heavy Transportation
#include <iostream> //dijstra算法的变形,求一条路径,使得它的最小边达到最大值
#include<set>
using namespace std;
int t,n,m,i,j,v,harsh[1005],edge[1005][1005],distD[1005],visit[1005];
void Dijstra()
{
visit[1]=1;distD[1]=0;
for(i=2;i<=v;++i)
{
distD[i]=edge[1][harsh[i]];
visit[i]=0;
}
for(i=2;i<=v;++i)
{
int Max=-1,u;
for(j=1;j<=v;++j)
{
if(!visit[j]&&distD[j]>Max) //找最大值
{
u=j;Max=distD[j];
}
}
visit[u]=1;
if(u==v)
{
printf("%d\n\n",distD[u]);
return ;
}
for(j=1;j<=v;++j)
{
if(!visit[j])
{
int e=min(distD[u],edge[harsh[u]][harsh[j]]); //求最长路径的最小边 ,与poj 2253 正好相反
if(distD[j]<e)
distD[j]=e;
}
}
}
}
int main()
{
int a,b,c;
scanf("%d",&t);
for(int k=1;k<=t;++k)
{
scanf("%d%d",&n,&m);
memset(edge,-1,sizeof(edge));
set<int> col;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
col.insert(a);col.insert(b);
edge[a][b]=edge[b][a]=c;
}
v=0;
for(set<int>::iterator ite=col.begin();ite!=col.end();++ite)
harsh[++v]=*ite; //对坐标离散化
printf("Scenario #%d:\n",k);
Dijstra();
}
return 0;
}