poj 1144 Network(无向图求割顶数)

  题目链接:poj 1144

  题意就是说有 n(标号为 1 ~ n)个网点连接成的一个网络,critical places 表示删去后使得图不连通的顶点,也就是割顶,求图中割顶的个数。

  直接上大白书上的模板即可,只是输入也有点卡人,我竟然傻傻的用手写的输入挂来处理,看了别人的博客才知道用 scanf("%s") 即可,因为 scanf("%s") 不会读入空格,再适当处理下即可。

  我的代码是:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<vector>
 6 using namespace std;
 7 const int N = 103;
 8 
 9 vector<int> G[N];
10 int pre[N], low[N], dfs_clock;
11 bool iscut[N];
12 
13 inline void add_edge(int from , int to) {
14     G[from].push_back(to);
15     G[to].push_back(from);
16 }
17 
18 int dfs(int u, int fa) {
19     int lowu = pre[u] = ++dfs_clock;
20     int child = 0;
21     for(int i = 0; i < G[u].size(); ++i) {
22         int v = G[u][i];
23         if(!pre[v]) {
24             ++child;
25             int lowv = dfs(v,u);
26             lowu = min(lowu, lowv);
27             if(lowv >= pre[u])
28                 iscut[u] = 1;
29         }
30         else if(pre[v] < pre[u] && v != fa)
31             lowu = min(lowu, pre[v]);
32     }
33     if(fa < 0 && child == 1)   iscut[u] = 0;
34     return low[u] = lowu;
35 }
36 
37 inline bool isline(const char &ch) {
38     return ch == '\n' || ch == '\r';
39 }
40 
41 #include<cctype>
42 bool eol;
43 inline void read(int &x) {
44     x = 0;
45     eol = 0;
46     char ch = getchar();
47     while(!isdigit(ch))
48         ch = getchar();
49     while(isdigit(ch)) {
50         x = x * 10 + (ch - '0');
51         ch = getchar();
52     }
53     if(isline(ch))   eol = 1;
54 }
55 
56 int main() {
57     int n,x;
58     while(~scanf("%d",&n),n) {
59         for(int i = 0; i < 101; ++i)
60             G[i].clear();
61         memset(pre,0,sizeof(pre));
62         memset(iscut,0,sizeof(iscut));
63         dfs_clock = 0;
64 
65         while(1) {
66             eol = 0;
67             read(x);
68             if(!x) {
69                 for(int i = 1; i <= n; ++i)
70                     if(!pre[i])   dfs(i, -1);
71                 int ans = 0;
72                 for(int i = 1; i <= n; ++i)
73                     if(iscut[i])   ++ans;
74                 printf("%d\n",ans);
75                 break;
76             }
77             else {
78                 int u = x;
79                 while(!eol) {
80                     read(x);
81                     add_edge(u,x);
82                 }
83             }
84         }
85     }
86     return 0;
87 }
posted @ 2015-08-12 17:34  Newdawn_ALM  阅读(171)  评论(0编辑  收藏  举报