您的位置:首页 > 其它

POJ 1144 Network (割点)

2017-07-14 20:47 274 查看

思路:

模版似的tarjan求割点。

注意本题输入很坑。。根本没必要这么搞啊。。

(我一开始读的char,被坑死,后来换了一种别人的写法就OK了)

#include <cstdio>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn = 110;
int ma[maxn][maxn];
int dfn[maxn],low[maxn],vis[maxn],stak[maxn],cntc,cntv,cnts,index;
int n;

void dfs(int u,int f){
dfn[u]=low[u]=++index;
stak[cnts++] = u;
vis[u] = 1;int chil = 0,flagu = 1;
for(int i = 1;i <= n;i++){
if(ma[u][i] && i!=f){
chil++;
if(!dfn[i]){
dfs(i,u);
low[u] = min(low[u],low[i]);
if(flagu && dfn[u] <= low[i] && (f != -1||chil > 1) ) {
cntv++;flagu = 0;
}
}
else if(vis[i]){
low[u] = min(low[u],dfn[i]);
}
}
}
if(dfn[u]==low[u]){
cntc++;int v;
do{
v = stak[--cnts];
vis[v]=0;
}while(v!=u);
}
}

void tarjan(){
for(int i = 1; i <= n;i++){
if(!dfn[i]) dfs(i,-1);
}
}

int main(){
while(scanf("%d",&n),n){
int u,v;
memset(ma,0,sizeof(ma));index = 0,cntc = 0,cntv=0,cnts=0;
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(vis,0,sizeof(vis));
while(scanf("%d",&u) && u){
while(getchar()!='\n'){
scanf("%d",&v);
ma[u][v]=1;
ma[v][u]=1;
}
}
tarjan();
printf("%d\n",cntv);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: