标签:
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 10764 | Accepted: 4978 |
Description
Input
Output
Sample Input
5 5 1 2 3 4 0 6 2 1 3 5 4 6 2 0 0
Sample Output
1 2
Hint
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#define maxn 1000+10
#define maxm 2000000+10
using namespace std;
struct node {
int u, v, next;
};
node edge[maxm];
int head[maxn], cnt;
bool is_cut[maxn];
int low[maxn], dfn[maxn];
int dfs_clock;
void init(){
cnt = 0;
memset(head, -1, sizeof(head));
}
void addedge(int u, int v){
edge[cnt] = {u, v, head[u]};
head[u] = cnt++;
edge[cnt] = {v, u, head[v]};
head[v] = cnt++;
}
int tarian(int u, int fa){
low[u] = dfn[u] = ++dfs_clock;
int son = 0;
for(int i = head[u]; i != -1; i = edge[i].next){
int v = edge[i].v;
if(!dfn[v]){
son++;
low[v] = tarian(v, u);
low[u] = min(low[u], low[v]);
if(low[v] >= dfn[u])
is_cut[u] = true;
}
else if(dfn[u] > dfn[v] && v != fa)
low[u] = min(low[u], dfn[v]);
}
if(fa < 0 && son == 1) is_cut[u] = 0;
if(fa < 0 && son > 1) is_cut[u] = true;
return low[u];
}
void find(int l, int r){
memset(low, 0, sizeof(low));
memset(dfn, 0, sizeof(dfn));
memset(is_cut, 0, sizeof(is_cut));
for(int i = l; i <= r; ++i)
if(!dfn[i]) tarian(i, -1);
}
int main (){
int n;
while(scanf("%d", &n), n){
init();
int u, v;
while(scanf("%d", &u), u){
while(getchar() != '\n'){
scanf("%d", &v);
addedge(u, v);
}
}
find(1, n);
int ans = 0;
for(int i = 1; i <= n; ++i)
if(is_cut[i])
ans++;
printf("%d\n", ans);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/hpuhjh/article/details/47448477