poj 1144 Network

来源:互联网 发布:sem优化技巧 编辑:程序博客网 时间:2024/06/13 21:38

题意:给定你一张图,求改图中有几个割点。


分析:直接上tarjan。


AC代码:

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;const int maxn = 105; int n;bool edge[maxn][maxn];int vis[maxn];//for tarjan int low[maxn];//for tarjanint subnet[maxn];//int cnt;//for tarjanint cut;bool input(){scanf("%d",&n);if(n == 0) return false;//clearfor(int i = 0; i <= n; i++){for(int j = 0; j <= n; j++){edge[i][j] = false;}}char s[1000];char *ss;int u,v;int p;gets(s);//清除换行 while(1){gets(s);ss = s;sscanf(ss,"%d%n",&u,&p);if(u == 0) break;ss += p;while(strlen(ss) > 0){sscanf(ss,"%d%n",&v,&p);ss += p;edge[u][v] = edge[v][u] = true;}}return true;}void dfs(int u){//tarjanvis[u] = low[u] = ++cnt;for(int v = 1; v <= n; v++){if(edge[u][v]){if(!vis[v]){dfs(v);low[u] = min(low[u],low[v]);if(low[v] >= vis[u]){subnet[u]++;}}else low[u] = min(low[u],vis[v]);}}}void solve(){//clearcnt = 0; cut = 0; for(int i = 0; i <= n; i++) {vis[i] = 0;  subnet[i] = 0;}dfs(1);if(subnet[1] > 1) cut++;for(int i = 2; i <= n; i++){if(subnet[i]) cut++;}printf("%d\n",cut);}int main(){while(input()){solve();}return 0;}


0 0