TZOJ 3663 最长路径(floyd)
描述
网络是由很多交换机与网线组成的,网络中的信息可能会在这些网络中不断转发,给定任意两个交换机,我们需要从中找到最快的路径进行转发,我们定义转发过程中所经过的网线条数为两个交换机之间的路径长度。如果交换机之间没有连接,则认为路径长度为无穷大。同时我们定义网络的最长路径就是任意交换机之间最短路径的最大值。给定一个网络的拓扑结构,请求其最长路径。
输入
输入数据有多组,第一行为一个整数n,表示交换机的台数,并且对这些交换机从1~n编号,接下来的n行中,第i行指定了若个与第i个交换机连接的交换机编号,如果该行为空,则表示没有指定任何编号。交换机之间的连接都是双向的,但描述信息中可能会给出单向或者双向的连接信息。
若n为0表示输入结束。
输出
输出网络的最长路径,如果最长路径为无穷大,请输出infinite,每组数据占一行。
样例输入
6
2 6 4
1 5 3
4 6
4 6
6
2
3
4
5
6
1
3
2
0
样例输出
2
3
infinite
题意
如上
题解
floyd模板题,最长路径==任意两点最短路径最大值
istringstream对象可以绑定一行字符串,默认以空格为分隔符把该行分隔开来
1 #include<stdio.h> 2 #include<string> 3 #include<iostream> 4 #include<algorithm> 5 #include<sstream>//头文件 6 using namespace std; 7 8 int dis[505][505]; 9 int main(){ 10 int i,j,k,n,w; 11 while(scanf("%d",&n)!=EOF,n){ 12 getchar();//读回车 13 for(i=1;i<=n;i++){ 14 for(j=1;j<=n;j++){ 15 if(i==j)dis[i][j]=0;//自己到自己为0 16 else dis[i][j]=1e9;//否则为无穷 17 } 18 } 19 20 char str[1005]; 21 for(i=1;i<=n;i++){ 22 gets(str); 23 string a=str; 24 istringstream ss(a);//流输入,ss不用定义 25 while(ss>>w){ 26 dis[i][w]=1;//双向 27 dis[w][i]=1; 28 } 29 } 30 31 for(k=1;k<=n;k++){//floyd算法 32 for(i=1;i<=n;i++){ 33 for(j=1;j<=n;j++){ 34 if(dis[i][j]>dis[i][k]+dis[k][j]) 35 dis[i][j]=dis[i][k]+dis[k][j]; 36 } 37 } 38 } 39 40 int x=0; 41 for(i=1;i<=n;i++){ 42 for(j=1;j<=n;j++){ 43 if(dis[i][j]>x) 44 x=dis[i][j]; 45 } 46 } 47 if(x==1e9)printf("infinite\n"); 48 else printf("%d\n",x); 49 } 50 return 0; 51 }