题意:给出无向图,问你哪些是割点并输出将这个点割掉后的图分为几块
思路:无向图割点的模版题,只不过再将cnt里的值输出而已
#include <vector>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1010;
vector<int>G[maxn];
int L[maxn],E[maxn],cnt[maxn],vis[maxn];
int k,kk;
void dfs(int x){
k++;E[x]=k;L[x]=k;vis[x]=1;
for(unsigned int i=0;i<G[x].size();i++){
int t=G[x][i];
if(!vis[t]){
dfs(t);
L[x]=min(L[x],L[t]);
if(L[t]>=E[x]&&x!=1) cnt[x]++;
else if(x==1) kk++;
}else L[x]=min(L[x],E[t]);
}
}
int main(){
int a,b,t=1;
while(scanf("%d",&a)!=-1){
if(a==0) break;
scanf("%d",&b);
for(int i=0;i<maxn;i++) G[i].clear();
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
G[a].push_back(b);
G[b].push_back(a);
while(1){
scanf("%d",&a);
if(a==0) break;
scanf("%d",&b);
G[a].push_back(b);
G[b].push_back(a);
}
k=0;kk=0;dfs(1);
int flag=0;
printf("Network #%d\n",t++);
for(int i=1;i<=1000;i++){
if(i==1&&kk>=2){
printf(" SPF node %d leaves %d subnets\n",i,kk);
flag=1;
}
else if(cnt[i]>=1){
flag=1;
printf(" SPF node %d leaves %d subnets\n",i,cnt[i]+1);
}
}
if(flag==0) printf(" No SPF nodes\n");
printf("\n");
}
return 0;
}