刚做完2253就做这题了。。和2253基本一样Dijkstra的变形,可以用dfs写,试了一下,但是好像又写了个最短路的递归版....
Dijkstra变形的时候注意找的是最大路径。虽然大致代码都自己编出来了,但是还是有好多细节没把握好,没能1a过。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define N 1000000
int map[1010][1010];
int n,m;
int lowcost[1010];
int vis[1010];
int Nn;
void Dijkstra()
{
int i,j,k,maxt;
int start=1;
for(i=1;i<=n;i++)
map[i][i]=N;
for(i=1;i<=n;i++)
lowcost[i]=map[start][i];
vis[start]=true;
for(i=1;i<=n;i++) //m条边
{
maxt=0;
for(j=1;j<=n;j++)
{
if((maxt<lowcost[j])&&!vis[j]) //变形,找最大值
{
maxt=lowcost[j];
k=j;
}
}
vis[k]=true;
for(j=1;j<=n;j++)
if(!vis[j]&&lowcost[j]<min(lowcost[k],map[k][j]))
{
lowcost[j]=min(lowcost[k],map[k][j]);
}
}
}
void input()
{
int weight,i,j,x,y;
cin>>n>>m;
memset(map,0,sizeof(map));
memset(lowcost,0,sizeof(lowcost));
memset(vis,0,sizeof(lowcost));
for(i=1;i<=m;i++) //邻接矩阵的输入
{
cin>>x>>y;cin>>weight;
map[x][y]=weight;
map[y][x]=weight;
}
}
int main()
{
int T;
cin>>T;
Nn=0;
while(T--)
{
Nn++;
input();
Dijkstra();
cout<<"Scenario #"<<Nn<<":"<<endl;
cout<<lowcost[n]<<endl;
if(T)
cout<<endl;
}
return 0;
}