1. 程式人生 > >UVA 315 :Network (無向圖求割頂)

UVA 315 :Network (無向圖求割頂)

time_t long == i++ while 只有一個 ext scu pri

題目鏈接

題意:求所給無向圖中一共有多少個割頂

用的lrj訓練指南P314的模板

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const int N=109;
struct Edge
{
    int to,next;
    Edge(){}
    Edge(int _to,int _next)
    {
        to=_to;
        next=_next;
    }
}edge[N*N*2];
int head[N];

int dfn[N],low[N];
int
iscut[N]; int n,tot; int time_tag; void addedge(int u,int v) { edge[tot]=Edge(v,head[u]); head[u]=tot++; } void init() { memset(dfn,0,sizeof(dfn)); memset(iscut,0,sizeof(iscut)); memset(head,-1,sizeof(head)); tot=time_tag=0; } void dfs(int u,int pre) { low[u]=dfn[u]=++time_tag;
int child=0; //子節點數目 for(int i=head[u];~i;i=edge[i].next) { int v=edge[i].to; if(!dfn[v]) // 把dfn[]當vis[]使用 { child++; dfs(v,u); low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]) iscut[u]=1; }
else if(dfn[v]<dfn[u] && v!=pre) low[u]=min(low[u],dfn[v]); } if(pre<0&&child==1) iscut[u]=0; //只有一個孩子的根節點 } int main() { while(scanf("%d",&n)>0&&n) { init(); int u,v; while(scanf("%d",&u)>0&&u) { while(getchar()!=\n) { scanf("%d",&v); addedge(u,v); addedge(v,u); } } dfs(1,-1); int ans=0; for(int i=1;i<=n;i++) if(iscut[i]) ans++; printf("%d\n",ans); } }

UVA 315 :Network (無向圖求割頂)