zoukankan      html  css  js  c++  java
  • UVa 125 Numbering Paths

     Numbering Paths 

    Background

    Problems that process input and generate a simple ``yes'' or ``no'' answer are called decision problems. One class of decision problems, the NP-complete problems, are not amenable to general efficient solutions. Other problems may be simple as decision problems, but enumerating all possible ``yes'' answers may be very difficult (or at least time-consuming).

    This problem involves determining the number of routes available to an emergency vehicle operating in a city of one-way streets.

    The Problem

    Given the intersections connected by one-way streets in a city, you are to write a program that determines the number of different routes between each intersection. A route is a sequence of one-way streets connecting two intersections.

    Intersections are identified by non-negative integers. A one-way street is specified by a pair of intersections. For example, tex2html_wrap_inline30 indicates that there is a one-way street from intersection j to intersectionk. Note that two-way streets can be modeled by specifying two one-way streets: tex2html_wrap_inline30 and tex2html_wrap_inline38 .

    Consider a city of four intersections connected by the following one-way streets:

        0  1
        0  2
        1  2
        2  3

    There is one route from intersection 0 to 1, two routes from 0 to 2 (the routes are tex2html_wrap_inline40 and tex2html_wrap_inline42 ), two routes from 0 to 3, one route from 1 to 2, one route from 1 to 3, one route from 2 to 3, and no other routes.

    It is possible for an infinite number of different routes to exist. For example if the intersections above are augmented by the street tex2html_wrap_inline44 , there is still only one route from 0 to 1, but there are infinitely many different routes from 0 to 2. This is because the street from 2 to 3 and back to 2 can be repeated yielding a different sequence of streets and hence a different route. Thus the route tex2html_wrap_inline46 is a different route than tex2html_wrap_inline48 .

    The Input

    The input is a sequence of city specifications. Each specification begins with the number of one-way streets in the city followed by that many one-way streets given as pairs of intersections. Each pair tex2html_wrap_inline30 represents a one-way street from intersection j to intersection k. In all cities, intersections are numbered sequentially from 0 to the ``largest'' intersection. All integers in the input are separated by whitespace. The input is terminated by end-of-file.

    There will never be a one-way street from an intersection to itself. No city will have more than 30 intersections.

    The Output

    For each city specification, a square matrix of the number of different routes from intersection j to intersection k is printed. If the matrix is denoted M, then M[j][k] is the number of different routes from intersection j to intersection k. The matrix M should be printed in row-major order, one row per line. Each matrix should be preceded by the string ``matrix for city k'' (with k appropriately instantiated, beginning with 0).

    If there are an infinite number of different paths between two intersections a -1 should be printed. DO NOTworry about justifying and aligning the output of each matrix. All entries in a row should be separated by whitespace.

    Sample Input

    7 0 1 0 2 0 4 2 4 2 3 3 1 4 3
    5 
    0 2 
    0 1 1 5 2 5 2 1
    9
    0 1 0 2 0 3
    0 4 1 4 2 1
    2 0
    3 0
    3 1

    Sample Output

    matrix for city 0
    0 4 1 3 2
    0 0 0 0 0
    0 2 0 2 1
    0 1 0 0 0
    0 1 0 1 0
    matrix for city 1
    0 2 1 0 0 3
    0 0 0 0 0 1
    0 1 0 0 0 2
    0 0 0 0 0 0
    0 0 0 0 0 0
    0 0 0 0 0 0
    matrix for city 2
    -1 -1 -1 -1 -1
    0 0 0 0 1
    -1 -1 -1 -1 -1
    -1 -1 -1 -1 -1
    0 0 0 0 0

    给一个有向图,求图中任意两点之间存在多少种不同的路径。

    这里采用了Floyd思想,设dp[i][j]表示从结点i到结点j的路径数,有:

      dp[i][j]= ∑dp[i][k]*dp[k][j]

    题目要求对于两点间有无数条路径的输出-1,即如果图中出现了环,那么环中的任意两点之间的路径数要输出-1,因此在Floyd执行完之后要进行一轮判断,判断的方法就是,对于任意的dp[x][x]!=0(即存在一个环可以从点x出发并再次回到x),我们找出满足dp[i][x]!=0&&dp[x][j]!=0的有序对(i,j),那么这对点(i,j)之间的路径是无穷多的,将dp[i][j]改为-1即可。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 
     6 using namespace std;
     7 
     8 int E;
     9 long long G[50][50];
    10 
    11 int main()
    12 {
    13     int kase = -1;
    14 
    15     while (scanf("%d", &E) == 1)
    16     {
    17         kase++;
    18 
    19         memset(G, 0, sizeof(G));
    20 
    21         int a, b, n = -1;
    22         for (int i = 1; i <= E; i++)
    23         {
    24             scanf("%d %d", &a, &b);
    25             G[a][b] += 1;
    26             if (max(a, b) > n)
    27                 n = max(a, b);
    28         }
    29 
    30         for (int k = 0; k <= n; k++)
    31             for (int i = 0; i <= n; i++)
    32                 for (int j = 0; j <= n; j++)
    33                     G[i][j] += G[i][k] * G[k][j];
    34 
    35         for(int k=0;k<=n;k++)
    36             if (G[k][k])
    37             {
    38                 for (int i = 0; i <= n; i++)
    39                     for (int j = 0; j <= n; j++)
    40                         if (G[i][k] && G[k][j])
    41                             G[i][j] = -1;
    42             }
    43 
    44         printf("matrix for city %d
    ", kase);
    45         for (int i = 0; i <= n; i++)
    46         {
    47             printf("%lld", G[i][0]);
    48             for (int j = 1; j <= n; j++)
    49                 printf(" %lld", G[i][j]);
    50             puts("");
    51         }
    52     }
    53 
    54     return 0;
    55 }
    [C++]
  • 相关阅读:
    在最近在研究榴莲品种的人工智能识别
    iOS开发:多线程技术概述
    Objective-C开发编码规范
    为什么OC语言很难
    内存堆栈的区别
    HR筒子说:程序猿面试那点事
    Objective-C语言的一些基础特性
    学习swift语言的快速入门教程推荐
    性能测试告诉你 mysql 数据库存储引擎该如何选?
    【柠檬班】需要先登录的接口如何做性能测试?
  • 原文地址:https://www.cnblogs.com/lzj-0218/p/3586634.html
Copyright © 2011-2022 走看看