zoukankan      html  css  js  c++  java
  • 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
    ");
    48         else printf("%d
    ",x);
    49     }
    50     return 0;
    51 }
  • 相关阅读:
    C#文件拖放至窗口的ListView控件获取文件类型
    android内存释放处理
    赵雅智_运用Bitmap和Canvas实现图片显示,缩小,旋转,水印
    POJ 3070 Fibonacci 矩阵高速求法
    poj 3261 后缀数组 找反复出现k次的子串(子串能够重叠)
    Codeforces Round #313 C. Gerald&#39;s Hexagon(放三角形)
    HTTP服务端JSON服务端
    iPad popView封装
    OpenCv 人脸检測的学习
    《深入理解java虚拟机》:类的初始化
  • 原文地址:https://www.cnblogs.com/taozi1115402474/p/8305847.html
Copyright © 2011-2022 走看看