[桥]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;}