题目链接:POJ 1797
分析:和POJ 2253类似,求所有通路中最大的最短边长度。
用cin读入会超时,用Floyd算法也会超时。
在Dijkstra中的松弛方程为:
dis[j]=max(dis[j],min(dis[u],map[u][j]));
CODE:
//***************AC******************
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxnum=1005;
int t,n,m;
int dis[maxnum],vis[maxnum],map[maxnum][maxnum];
int Dijkstra(int n,int dis[maxnum],int map[maxnum][maxnum])
{
memset(vis,0,sizeof(vis));
for(int i=2;i<=n;i++)
dis[i]=map[1][i];
dis[1]=0,vis[1]=1;
for(int i=1;i<n;i++)
{
int u=1;
int tmp=-1;
for(int j=2;j<=n;j++)
{
if((!vis[j])&&dis[j]>tmp)
{
u=j;
tmp=dis[j];
}
}
vis[u]=1;
for(int j=2;j<=n;j++)
{
if((!vis[j])&&map[u][j]>-1)
dis[j]=max(dis[j],min(dis[u],map[u][j]));
}
}
return dis[n];
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
cin>>t;
int cases=0,ans;
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
dis[i]=-1;
for(int j=1;j<=n;j++)
map[i][j]=-1;
}
int p,q,len;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&p,&q,&len);
if(len>map[p][q])
map[p][q]=map[q][p]=len;
}
ans=Dijkstra(n,dis,map);
printf("Scenario #%d:\n%d\n\n",++cases,ans);
}
return 0;
}
//*************TLE********************
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxnum=1005;
int t,dis[maxnum][maxnum],n,m;
int Floyd(int n,int dis[maxnum][maxnum])
{
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
dis[i][j]=max(dis[i][j],min(dis[i][k],dis[k][j]));
}
}
return dis[1][n];
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
scanf("%d",&t);
int cases=0,ans;
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
dis[i][j]=-1;
}
int p,q,len;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&p,&q,&len);
if(len>dis[p][q])
dis[p][q]=dis[q][p]=len;
}
ans=Floyd(n,dis);
printf("Scenario #%d:\n%d\n\n",++cases,ans);
}
return 0;
}