poj 3177 Redundant Paths 有重边的 缩点

题目链接:http://poj.org/problem?id=3177

这道题跟3352十分相似,只是有重边的,再输入的过程中处理下就可以了。

View Code
  1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 using namespace std;
5 const int MAX=5005;
6 struct ss {
7 int x;
8 int next;
9 }edge[MAX*3];
10
11 int degree[MAX];
12 int head[MAX];
13 int vist[MAX];
14 int DFS[MAX],low[MAX];
15 int n,r,N,index,ans;
16
17 void init()
18 {
19 memset(head,-1,sizeof(head));
20 memset(vist,0,sizeof(vist));
21 memset(DFS,0,sizeof(DFS));
22 memset(low,0,sizeof(low));
23 memset(edge,0,sizeof(edge));
24 memset(degree,0,sizeof(degree));
25 N=0;
26 index=0;
27 ans=0;
28 }
29
30 void add(int u,int v)
31 {
32 edge[N].x=v;
33 edge[N].next=head[u];
34 head[u]=N++;
35
36 edge[N].x=u;
37 edge[N].next=head[v];
38 head[v]=N++;
39 }
40
41 int find(int u,int v)
42 {
43 int i;
44 for (i=head[u];i!=-1;i=edge[i].next)
45 {
46 if(edge[i].x==v) return 1;
47 }
48 return 0;
49 }
50 void trajan(int u,int fa)
51 {
52 int i,v;
53 vist[u]=1;
54 DFS[u]=low[u]=++index;
55 for (i=head[u];i!=-1;i=edge[i].next)
56 {
57 v=edge[i].x;
58 if(v!=fa)
59 {
60 if(!DFS[v])
61 {
62 trajan(v,u);
63 if(low[u]>low[v])
64 low[u]=low[v];
65 }
66 else if(vist[v]&&low[u]>DFS[v]) low[u]=DFS[v];
67 }
68 }
69 }
70
71 void sove()
72 {
73 int i,j,u,v;
74 for (i=1;i<=n;i++)
75 {
76 u=i;
77 for (j=head[u];j!=-1;j=edge[j].next)
78 {
79 v=edge[j].x;
80 if(low[u]!=low[v])
81 {
82 degree[low[u]]++;
83 degree[low[v]]++;
84 }
85 }
86
87 }
88
89 for (i=1;i<=n;i++)
90 if(degree[i]==2)
91 ans++;
92 ans=(ans+1)/2;
93 }
94 int main()
95 {
96 int i,x,y;
97 while (scanf("%d%d",&n,&r)!=EOF)
98 {
99 init();
100 for (i=1;i<=r;i++)
101 {
102 scanf("%d%d",&x,&y);
103 if(find(x,y))continue;
104 else add(x,y);
105 }
106 trajan(1,-1);
107 sove();
108 printf("%d\n",ans);
109 }
110 return 0;
111 }

 

posted @ 2012-04-03 19:52  我们一直在努力  阅读(193)  评论(0编辑  收藏  举报