poj 3713 图的三连通

来源:互联网 发布:某企业调查用户从网络 编辑:程序博客网 时间:2024/05/26 19:19
//图的三连通的判断//在图中删去一个点,判断是否存在割点,以及判断图是否连通#include<stdio.h>#include<string.h>#include<vector>using namespace std;const int MAX = 1010;vector<int> edge[MAX];int low[MAX],dfn[MAX];int vis[MAX];int n,m,tdfn;bool flag=0;int root;inline int min(int a,int b){return a<b?a:b;}void dfs(int u,int fa){vis[u]=1;dfn[u]=low[u]=++tdfn;int tol=0,i,v;for(i=0;i<edge[u].size();i++){v=edge[u][i];if(vis[v]==2)  continue;if(vis[v]==0){dfs(v,u);tol++;low[u]=min(low[u],low[v]);if(u==root&&tol>1||u!=root&&low[v]>=dfn[u]){flag=true;//存在割点return ;}}else if(vis[v]==1&&v!=fa)low[u]=min(low[u],dfn[v]);}return ;}int main(){    while(scanf("%d%d",&n,&m),n||m){flag=0;int i,j,a,b;for(i=0;i<=n;i++)edge[i].clear();for(i=1;i<=m;i++){scanf("%d%d",&a,&b);edge[a].push_back(b);edge[b].push_back(a);}for(i=0;i<n;i++){memset(vis,0,sizeof(vis));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));vis[i]=2;//去掉一个点root=0;tdfn=0;if(i==0) root=1;dfs(root,-1);for(j=0;j<n;j++){if(vis[j]==0){flag=1;break;}}if(flag==1) break;}if(flag) printf("NO\n");else printf("YES\n");}return 0;}

原创粉丝点击