[桥]uva 5796 Hedge Mazes

来源:互联网 发布:淘宝网上银行支付 编辑:程序博客网 时间:2024/05/19 22:58
/**[桥]uva 5796 Hedge Mazes判断图上两点是否有且只有一条简单路。结论,若两点只有一条简单路,则这两点之间必然只由原图中的桥连接*/#include <stdio.h>#include <string.h>#include <vector>using namespace std;#define N 10007int dfn[N],vis[N],low[N],tim,f[N],r[N];vector<int> g[N];int getF(int x){    return x == f[x] ? x : getF(f[x]);}void unionSet(int x,int y){    x = getF(x),y = getF(y);    if(r[x] > r[y])        f[y] = x;    else    {        f[x] = y;        if(r[x] == r[y])            ++r[y];    }}void dfs(int u,int ft,int dep){    vis[u] = 1;    low[u] = dfn[u] =  dep;    for(int i = 0; i < g[u].size(); ++i)    {        int v = g[u][i];        if(vis[v] == 1 && v != ft)            low[u] = min(low[u],dfn[v]);        if(vis[v] == 0)        {            dfs(v,u,dep+1);            low[u] = min(low[v],low[u]);            if(low[v] > dfn[u])                unionSet(v,u);        }    }    vis[u] = 2;}int main(){    int i,n,m,q,a,b;    while(scanf("%d%d%d",&n,&m,&q) != EOF && n)    {        for(i = 0; i <= n; ++i)            g[i].clear(),f[i] = i,r[i] = 0;        memset(vis,0,sizeof(vis));        while(m--)        {            scanf("%d%d",&a,&b);            g[a].push_back(b);            g[b].push_back(a);        }        for(i = 1; i <= n; ++i)            if(!vis[i])                dfs(i,1,0);        while(q--)        {            scanf("%d%d",&a,&b);            a = getF(a),b = getF(b);            printf(a == b ? "Y\n" : "N\n" );        }        puts("-");    }    return 0;}

原创粉丝点击