首页 > 其他 > 详细

UVa 125 Numbering Paths

时间:2014-03-07 19:10:37      阅读:516      评论:0      收藏:0      [点我收藏+]
 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, bubuko.com,布布扣 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: bubuko.com,布布扣 and bubuko.com,布布扣 .

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 bubuko.com,布布扣 and bubuko.com,布布扣 ), 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 bubuko.com,布布扣 , 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 bubuko.com,布布扣 is a different route than bubuko.com,布布扣 .

 

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 bubuko.com,布布扣 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即可。

 

bubuko.com,布布扣
 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\n", 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++]

UVa 125 Numbering Paths,布布扣,bubuko.com

UVa 125 Numbering Paths

原文:http://www.cnblogs.com/lzj-0218/p/3586634.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!