poj1144
http://poj.org/problem?id=1144
求图中割点数目,只是输入处理比较麻烦,由于不知道有多长,所以需要字符输入然后转换成数字
1 #include <stdio.h>
2 #include <string.h>
3 #define SIZE 101
4 #define MIN(a,b) ((a)<(b)?(a):(b))
5 bool map[SIZE][SIZE],cut[SIZE];
6 int num,cnt,count,k,dfn[SIZE],low[SIZE];
7 const int root=1;
8 char line[5*SIZE];
9 void init()
10 {
11 memset(dfn,0,sizeof(dfn));
12 memset(low,0,sizeof(low));
13 memset(map,false,sizeof(map));
14 memset(cut,false,sizeof(cut));
15 memset(line,'\0',sizeof(line));
16 }
17 void bulid() //构图
18 {
19 int i=0,from=0,to=0;
20 while(line[i]>='0'&&line[i]<='9')
21 from=from*10+line[i++]-'0';
22 do
23 {
24 ++i;
25 to=0;
26 while(line[i]>='0'&&line[i]<='9')
27 to=to*10+line[i++]-'0';
28 map[from][to]=map[to][from]=true;
29 }while(line[i]!='\0');
30 }
31 void tarjan(int key)
32 {
33 dfn[key]=low[key]=++cnt;
34 for(int i=1;i<=num;++i)
35 if(map[key][i])
36 if(!dfn[i])
37 {
38 tarjan(i);
39 if(key==root&&!count)
40 {
41 ++count;
42 continue;
43 } //特判根节点是否是割点
44 if(dfn[key]<=low[i])
45 cut[key]=true;
46 else
47 low[key]=MIN(low[key],low[i]);
48 }
49 else
50 low[key]=MIN(low[key],dfn[i]);
51 }
52 int main()
53 {
54 while(gets(line)&&line[0]!='0')
55 {
56 sscanf(line,"%d",&num);
57 while(gets(line)&&line[0]!='0')
58 bulid();
59 cnt=count=k=0;
60 tarjan(root);
61 for(int i=1;i<=num;++i)
62 if(cut[i])
63 ++k;
64 printf("%d\n",k);
65 init();
66 }
67 return 0;
68 }