输入一个n表示有n个点,接下来n行,每行(假设是u)第一个数字m表示有m对数字(每一对两个数字v,w,表示u到v的时间w),后面接m对数字。找一个起点,它到其他点所花费的时间(求起点到其他点距离的最大值)是最小的(有点绕)。
思路:用floyd求出点和点的最小距离,然后遍历每个点为起点的情况,找出每个点作为起点到其他点所花费时间最大值里的最小值
代码:
#include<iostream> #include<cstring> #include<algorithm> using namespace std; #define inf 0x3f3f3f int map[105][105]; int n,m,k,t; void floyd() { for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; } } } } int main() { while((cin>>n)&&n) { int v,w; memset(map,inf,sizeof(map)); for(int i=1;i<=n;i++) { cin>>m; for(int j=0;j<m;j++) { cin>>v>>w; if(map[i][v]>w) map[i][v]=w; } } floyd(); int ans=inf,u=0; for(int i=1;i<=n;i++) { int max1=0; for(int j=1;j<=n;j++) { if(i!=j) { if(map[i][j]!=inf) max1=max(map[i][j],max1); else break; //无法到达所有点,直接跳出循环 } } if(ans>max1)//更新ans和u { ans=max1; u=i; } } if(ans!=inf) cout<<u<<' '<<ans<<endl; else cout<<"disjoint"<<endl; } return 0; }