最近一直做周赛和电子科大的~抽空复习图论了
这个题就是求割点,算是模板题
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1e5+1000;
int e,n,dep,son,head[maxn],pnt[maxn],nxt[maxn],low[maxn],dfn[maxn],cnt[maxn];
bool vis[maxn];
void AddEdge(int u,int v)
{
pnt[e]=v;nxt[e]=head[u];head[u]=e++;
pnt[e]=u;nxt[e]=head[v];head[v]=e++;
}
void DFS(int u)
{
for(int i=head[u];i!=-1;i=nxt[i])
{
if(!vis[pnt[i]])
{
vis[pnt[i]]=1;
dfn[pnt[i]]=low[pnt[i]]=dep++;
DFS(pnt[i]);
low[u]=min(low[u],low[pnt[i]]);
if(low[pnt[i]]>=dfn[u])
{
if(u!=1)
cnt[u]++;
else
son++;
}
}
else
low[u]=min(low[u],dfn[pnt[i]]);
}
}
int main()
{
int cas=1;
while(1)
{
memset(head,-1,sizeof(head));
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
e=n=son=0;
int u,v;
scanf("%d",&u);
if(!u)
break;
n=max(n,u);
scanf("%d",&v);
n=max(n,v);
AddEdge(u,v);
while(1)
{
scanf("%d",&u);
if(!u)
break;
n=max(n,u);
scanf("%d",&v);
n=max(n,v);
AddEdge(u,v);
}
dep=1;
dfn[1]=low[1]=dep++;
vis[1]=1;
DFS(1);
if(cas>1)
printf("\n");
printf("Network #%d\n",cas++);
if(son>1)
cnt[1]=son-1;
bool is=false;
for(int i=1;i<=n;i++)
if(cnt[i])
{
is=true;
printf(" SPF node %d leaves %d subnets\n",i,cnt[i]+1);
}
if(!is)
printf(" No SPF nodes\n");
}
return 0;
}