sicily 有向图边的分类

http://soj.sysu.edu.cn/show_problem.php?pid=1005&cid=1779

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int graph[101][101];
 6 int kind[101][101]; 
 7 int vis[101];
 8 int pre[101];
 9 int post[101];
10 
11 int n, m;
12 int ans=0;
13 int flag;
14 int tag;
15 
16 void dfs(int x)
17 {
18     pre[x] = ++tag;
19     for(int i=1; i<=n; i++)
20     {
21         if(graph[x][i])
22         {
23             if(pre[i] == 0)
24             {
25                 kind[x][i] = 1;
26                 dfs(i);
27             }            
28             else
29             {
30                 if(post[i] == 0)
31                 {
32                     kind[x][i] = 3;
33                     flag=0;
34                 }
35                     
36                 else if(pre[i] > pre[x])
37                     kind[x][i] = 2;
38                 else
39                     kind[x][i] = 4;
40             }
41         }
42     }
43     post[x] = ++tag;
44 }
45 
46 int main()
47 {
48     int ca;
49     while(cin >> n >> m)
50     {
51         tag=0;
52         flag=1;
53         memset(graph, 0, sizeof(graph));
54         memset(vis, 0, sizeof(vis));
55         memset(kind, 0, sizeof(kind));
56         for(int i=0; i<m; i++)
57         {
58             int u, v;
59             cin >> u >> v;
60             graph[u][v]=1;
61         }
62         dfs(1);
63         int q;
64         cin >> q;
65         for(int i=0; i<q; i++)
66         {
67             int u, v;
68             cin >> u >> v;
69             cout << "edge (" << u << "," << v << ") is ";
70             if(kind[u][v] == 1)
71                 cout << "Tree Edge" << endl;
72             if(kind[u][v] == 2)
73                 cout << "Down Edge" << endl;
74             if(kind[u][v] == 3)
75                 cout << "Back Edge" << endl; 
76             if(kind[u][v] == 4)
77                 cout << "Cross Edge" << endl;
78         } 
79     }
80     return 0;
81 }

 

posted @ 2015-04-26 17:51  dominjune  阅读(364)  评论(0编辑  收藏  举报