UVA 315 :Network (無向圖求割頂)
阿新 • • 發佈:2017-09-21
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]; intiscut[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 (無向圖求割頂)