http://wikioi.com/problem/1020/
无下限的坑啊
题目要求选择两个点,使从任意一点到这两个点中的一个距离最小
首先注意“通道数目”是点数不是边数……读边的时候记的用EOF
用floyd计算每两点间的距离
然后三层for枚举两只蜘蛛在哪两个点,以及蛾子在哪个点,找最大值的最小值
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int g[110][110];
int n;
void init()
{
int i,a,b,t;
scanf("%d",&n);
memset(g,-1,sizeof(g));
while(scanf("%d%d%d",&a,&b,&t)!=EOF)//注意!!!!
g[a][b]=g[b][a]=t;
}
void floyd()//找最短
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)if(i!=k)
for(j=1;j<=n;j++)if(i!=j&&j!=k)
if(g[i][k]!=-1&&g[k][j]!=-1)
if(g[i][j]>g[i][k]+g[k][j]||g[i][j]==-1)
g[i][j]=g[i][k]+g[k][j];
}
int min(int a,int b)
{
if(a>b) return b;
return a;
}
int judge(int x,int y)
{
int i,f=0;
for(i=1;i<=n;i++)
if(f<min(g[x][i],g[y][i]))
f=min(g[x][i],g[y][i]);
return f;
}
void print()
{
int i,j,x,y,ans=-1,p;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)//枚举地点
{
p=judge(i,j);//找到这两点为起点的最大值
if(p<ans||ans==-1)//更新
{
ans=p;
x=i;
y=j;
}
}
printf("%d %d\n",x,y);
}
int main()
{
init();
floyd();
print();
return 0;
}