割图

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<math.h>
using namespace std;
#define M 9999
int n,m,e[M][M],root;
int num[M],low[M],flag[M],index;//割点
void dfs(int o,int f)
{
    int child=0;
    index++;
    num[o]=index;
    low[o]=index;
    for(int i=1;i<=n;i++)
    {
        if(e[o][i]==1)
        {
            if(num[i]==0)
            {
                child++;
                dfs(i,o);
                low[o]=min(low[o],low[i]);
                if(o!=root&&low[i]>=num[o])//if(o!=root&&low[i]>num[o])就变成了割边“low[i]>num[o]”连父节点都回不去 
                    flag[o]=1;
                if(o==root&&child==2)
                    flag[o]=1;
            }else
            if(i!=f)
                low[o]=min(low[o],num[i]);
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1,x,y;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        e[x][y]=1;
        e[y][x]=1;
    }
    root=1;
    dfs(1,root);
    for(int i=1;i<=n;i++)
    if(flag[i])    printf("%d ",i);
    return 0;
}

 

#include<iostream>
#include<cstdio>
#include<algorithm> 
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
#define M  100001
int na[2*M],h[M],nex[2*M];
int num[M],low[M],flag[M],index,ans,n,m,root;//割边
void dfs(int cur ,int father)
{

    ++index;
    num[cur]=index;
    low[cur]=index;
    for(int i=h[cur];i;i=nex[i])
    {
        int o=na[i];    
        if(!num[o])
        {            
            dfs(o,cur);
            low[cur]=min(low[cur],low[o]);
            if(low[o]>num[cur])            
                printf("%d~%d\n",cur,o),ans++;
        }else
        if(o!=father)    
        low[cur]=min(low[cur],low[o]);                
        
    }
}
int main()
{
    int tot=0;
    scanf("%d%d",&n,&m);
    for(int i=1,x,y;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        na[++tot]=y;nex[tot]=h[x];h[x]=tot;
        na[++tot]=x;nex[tot]=h[y];h[y]=tot;
    }
    
    for(int i=1;i<=n;i++)
    if(!num[i])
    {        
        root=i;
        dfs(i,root);
    }    
    printf("%d\n",ans);
    for(int i=1;i<=n;i++)
    if(flag[i])    printf("%d\n",i);    
    return 0;
}

 

posted @ 2017-03-19 09:20  浪矢-CL  阅读(122)  评论(0)    收藏  举报