POJ 3352 边-双连通 HDU 2767 强连通

来源:互联网 发布:matlab修改矩阵元素 编辑:程序博客网 时间:2024/06/08 10:08

POJ3352

边-双连通模板题

//#pragma comment(linker, "/STACK:102400000,102400000")#include<cstdio>#include<cstring>#include<vector>#include<queue>#include<cmath>#include<cctype>#include<string>#include<algorithm>#include<iostream>#include<ctime>#include<map>#include<set>using namespace std;#define MP(x,y) make_pair((x),(y))#define PB(x) push_back(x)//typedef __int64 LL;//typedef unsigned __int64 ULL;/* ****************** */const int INF=100011122;const double INFF=1e100;const double eps=1e-8;const int mod=9999991;const int NN=1005;const int MM=2000010;/* ****************** */struct G{    int u,v,next;    bool fg;}E[NN*2];int p[NN],T;int dfn[NN],low[NN],tsp;int sta[NN],sta_top;int id[NN],id_cnt;int du[NN];void add(int u,int v){    E[T].u=u;    E[T].v=v;    E[T].next=p[u];    E[T].fg=false;    p[u]=T++;}int findid(int x){    if(id[x]==x)return x;    return id[x]=findid(id[x]);}void tarjan(int u){    int i,v;    dfn[u]=low[u]=++tsp;    sta[++sta_top]=u;    for(i=p[u];i+1;i=E[i].next)    {        if(E[i].fg)            continue;        v=E[i].v;        if(!dfn[v])        {            E[i].fg=true;            E[i^1].fg=true;            tarjan(v);            low[u]=min(low[u],low[v]);        }        else        {            low[u]=min(low[u],dfn[v]);        }    }    if(low[u]==dfn[u])    {        id_cnt++;        do        {            v=sta[sta_top--];            id[v]=u;        }while(v!=u);    }}int main(){    int n,m,u,v,i,ans;    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(p,-1,sizeof(p));        T=0;        while(m--)        {            scanf("%d%d",&u,&v);            add(u,v);            add(v,u);        }        for(i=1;i<=n;i++)        {            dfn[i]=low[i]=0;            id[i]=i;        }        tsp=0;        sta_top=0;        id_cnt=0;        tarjan(1);        for(i=1;i<=n;i++)        {            du[i]=0;        }        for(i=0;i<T;i+=2)        {            u=findid(E[i].u);            v=findid(E[i].v);            if(u!=v)            {                du[u]++;                du[v]++;            }        }        ans=0;        for(i=1;i<=n;i++)            if(du[i]==1)                ans++;        printf("%d\n",(ans+1)/2);    }    return 0;}

HDU 2767

强连通模板题

//#pragma comment(linker, "/STACK:102400000,102400000")#include<cstdio>#include<cstring>#include<vector>#include<queue>#include<cmath>#include<cctype>#include<string>#include<algorithm>#include<iostream>#include<ctime>#include<map>#include<set>using namespace std;#define MP(x,y) make_pair((x),(y))#define PB(x) push_back(x)//typedef __int64 LL;//typedef unsigned __int64 ULL;/* ****************** */const int INF=100011122;const double INFF=1e100;const double eps=1e-8;const int mod=9999991;const int NN=20005;const int MM=50010;/* ****************** */struct G{    int u,v,next;}E[MM];int p[NN],T;int dfn[NN],low[NN],tsp;int sta[NN],sta_top;bool in_sta[NN];int id[NN],id_cnt;int ind[NN],outd[NN];void add(int u,int v){    E[T].u=u;    E[T].v=v;    E[T].next=p[u];    p[u]=T++;}void scc(int u){    int i,v;    dfn[u]=low[u]=++tsp;    sta[++sta_top]=u;    in_sta[u]=true;    for(i=p[u];i+1;i=E[i].next)    {        v=E[i].v;        if(dfn[v]==0)        {            scc(v);            low[u]=min(low[u],low[v]);        }        else if(in_sta[v])            low[u]=min(low[u],dfn[v]);    }    if(dfn[u]==low[u])    {        id_cnt++;        for(;;)        {            v=sta[sta_top--];            id[v]=id_cnt;            in_sta[v]=false;            if(v==u)break;        }    }}int main(){    int cas,n,m;    int u,v,i,ans1,ans2;    scanf("%d",&cas);    while(cas--)    {        scanf("%d%d",&n,&m);        memset(p,-1,sizeof(p));        T=0;        while(m--)        {            scanf("%d%d",&u,&v);            add(u,v);        }        for(i=1;i<=n;i++)        {            dfn[i]=low[i]=0;            id[i]=-1;            in_sta[i]=false;        }        tsp=0;        sta_top=0;        id_cnt=0;        for(i=1;i<=n;i++)        {            if(dfn[i]==0)                scc(i);        }        if(id_cnt==1)        {            puts("0");            continue;        }        for(i=1;i<=id_cnt;i++)            ind[i]=outd[i]=0;        for(i=0;i<T;i++)        {            u=id[ E[i].u ];            v=id[ E[i].v ];            if(u!=v)            {                outd[u]++;                ind[v]++;            }        }        ans1=ans2=0;        for(i=1;i<=id_cnt;i++)        {            if(ind[i]==0)                ans1++;            if(outd[i]==0)                ans2++;        }        printf("%d\n",max(ans1,ans2));    }    return 0;}


0 0
原创粉丝点击