hdu1269 迷宫城堡(tarjan或并查集)

tarjan 46MS:
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
#define MAXN 10005
vector<int> adjlist[MAXN];
int bcnt,times,dfn[MAXN],low[MAXN],stk[MAXN],top;
bool instk[MAXN];
inline int Min(int a,int b)
{
    return a<b?a:b;
}
void dfs(int u)
{
    dfn[u]=low[u]=++times;
    stk[++top]=u;
    instk[u]=true;
    for(vector<int>::size_type sz=0; sz<adjlist[u].size(); sz++)
    {
        int v=adjlist[u][sz];
        if(dfn[v]==0)
        {
            dfs(v);
            low[u]=Min(low[u],low[v]);
        }
        else if(instk[v]);
        low[u]=Min(low[u],dfn[v]);
    }
    if(dfn[u]==low[u])
    {
        bcnt++;
        int j;
        do
        {
            j=stk[top--];
            instk[j]=false;
        }
        while(j!=u);
    }
}
int main()
{
    int n,m,i,j;
    while(scanf("%d %d",&n,&m) , n+m )
    {
        for(i=1; i<=n; i++) adjlist[i].clear();
        while(m--)
        {
            scanf("%d %d",&i,&j);
            adjlist[i].push_back(j);
        }
        top=-1;
        times=bcnt=0;
        memset(dfn,0,sizeof(*dfn)*(n+1));
        memset(low,0,sizeof(*low)*(n+1));
        memset(instk,false,sizeof(instk));
        for(i=1; i<=n; i++)
            if(dfn[i]==0)
                dfs(i);
        if(bcnt>1) printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

 


//*******************************************************************


mfs 31ms:
#include <stdio.h>
#include <string.h>
#define MAXN 10005
int n,father1[MAXN],father2[MAXN];
int find1(int x)
{
    int i,t;
    for(i = x; i != 1 && father1[i] > 0; i=father1[i] );
    while(x!=i)
    {
        t=father1[x];
        father1[x]=i;
        x=t;
    }
    return i;
}
int find2(int x)
{
    int i,t;
    for(i = x; i != 1 && father2[i] > 0; i=father2[i] );
    while(x!=i)
    {
        t=father2[x];
        father2[x]=i;
        x=t;
    }
    return i;
}
inline void merge(int x,int y)
{
    int fx,fy;
    if(x!=1)
    {
        fx=find1(x);
        fy=find1(y);
        if(fx!=fy) father1[fx]=fy;
    }
    if(y!=1)
    {
        fx=find2(x);
        fy=find2(y);
        if(fx!=fy) father2[fy]=fx;
    }
}
bool judge()
{
    int i;
    for(i=2; i<=n; i++)
        if(find1(i)!=1 || find2(i)!=1)
            return false;
    return true;
}
int main()
{
    int m,i,j;
    while(scanf("%d %d",&n,&m),n+m)
    {
        memset(father1,-1,sizeof(*father1)*(n+1));
        memset(father2,-1,sizeof(*father2)*(n+1));
        while(m--)
        {
            scanf("%d %d",&i,&j);
            merge(i,j);
        }
        if(judge()) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

posted @ 2010-08-27 14:13  菜到不得鸟  阅读(382)  评论(0)    收藏  举报