您的位置:首页 > 其它

poj 1144 Network

2015-03-24 11:22 253 查看
题意:给定你一张图,求改图中有几个割点。

分析:直接上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 tarjan
int subnet[maxn];//
int cnt;//for tarjan
int cut;

bool input(){
scanf("%d",&n);
if(n == 0) return false;

//clear
for(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){//tarjan
vis[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(){

//clear
cnt = 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: