poj 1523 SPF 割点

题目链接:http://poj.org/problem?id=1523
View Code
 1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <stack>
5 using namespace std;
6 const int MAX=1030; //poj很神奇这里写成1025 就是wa
7 struct ss {
8 int v,next;
9 }edge[MAX];
10 int head[MAX],DFN[MAX],low[MAX],subnet[MAX];
11 int nodes,son;
12 int idenx;
13 int N;
14 int min(int x,int y)
15 {
16 if(x>y)return y;
17 else return x;
18 }
19 void init()
20 {
21 int i;
22 nodes=son=0;
23 N=0;
24 idenx=0;
25 for (i=1;i<=MAX;i++)
26 subnet[i]=1;
27 memset(head,-1,sizeof(head));
28 memset(DFN,0,sizeof(DFN));
29 memset(low,0,sizeof(low));
30 }
31 void add(int u,int v)
32 {
33 edge[N].v=v;
34 edge[N].next=head[u];
35 head[u]=N++;
36 }
37
38 void trajan(int u)//求个点的主要算法
39 {
40 int i,v;
41 low[u]=DFN[u]=++idenx;
42 for (i=head[u];i!=-1;i=edge[i].next)
43 {
44 v=edge[i].v;
45 if(!DFN[v])
46 {
47 trajan(v);
48 low[u]=min(low[u],low[v]);
49 if(low[v]>=DFN[u])
50 {
51 if(u!=1)subnet[u]++;
52 else if(u==1)son++;
53 }
54 }
55 else low[u]=min(low[u],DFN[v]);
56 }
57 }
58 int main()
59 {
60 int i,u,v,flag;
61 int cases=1;
62 while (scanf("%d",&u),u)
63 {
64 init();
65 scanf("%d",&v);
66 if(u>nodes)nodes=u;
67 if(v>nodes)nodes=v;
68 add(u,v);
69 add(v,u);
70 while (scanf("%d",&u),u)
71 {
72 scanf("%d",&v);
73 if(u>nodes)nodes=u;
74 if(v>nodes)nodes=v;
75 add(u,v);
76 add(v,u);
77 }
78 trajan(1);
79 if(son>1)subnet[1]=son;
80 flag=0;
81 if(cases>1)printf("\n");
82 printf("Network #%d\n",cases++);
83 for(i=1;i<=nodes;i++)
84 {
85 if(subnet[i]>1)
86 {
87 flag=1;
88 printf(" SPF node %d leaves %d subnets\n",i,subnet[i]);
89 }
90 }
91 if(!flag)
92 printf(" No SPF nodes\n");
93 }
94 return 0;
95 }



posted @ 2012-03-31 16:11  我们一直在努力  阅读(153)  评论(0编辑  收藏  举报