[ create a new paste ] login | about

Link: http://codepad.org/IEFBqUwI    [ raw code | fork ]

C++, pasted on Feb 26:
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#define MAX 10005

using namespace std;

int R, C, Q;
vector <int> l[MAX];
int vis[MAX];
int viu[MAX];
int pai[MAX];
bool paiponte[MAX];
int cnt;

void dfs(int x){
	vis[x] = cnt++;
	viu[x] = vis[x];
	for (int i = 0; i < (int)l[x].size(); i++){
		if(l[x][i] != pai[x]){
			if(vis[l[x][i]] == -1){
				pai[l[x][i]] = x;
				dfs(l[x][i]);
				viu[x] = min(viu[x], viu[l[x][i]]);
			}
			viu[x] = min(viu[x], vis[l[x][i]]);
		}
	}
	for (int i = 0; i < (int)l[x].size(); i++){
		if(l[x][i] != pai[x] && viu[l[x][i]] > vis[x])
			paiponte[l[x][i]] = true;
	}
}

void dfsp(int x){
	vis[x] = cnt;
	for (int i = 0; i < (int)l[x].size(); i++){
		if(vis[l[x][i]] == -1 && ((pai[l[x][i]] == x && paiponte[l[x][i]]) || (pai[x] == l[x][i] && paiponte[x])) ){
			dfsp(l[x][i]);
		}
	}
}

int main(){
	while(scanf("%d%d%d", &R, &C, &Q) && R > 0){
		for (int i = 0; i < R; i++){
			pai[i] = vis[i] = viu[i] = -1;
			paiponte[i] = false;
			l[i].clear();
		}
		for (int i = 0; i < C; i++){
			int x, y;
			scanf("%d%d", &x, &y);
			x--; y--;
			l[x].push_back(y);
			l[y].push_back(x);
		}
		for (int i = 0; i < R; i++)
			if(vis[i] == -1){
				cnt = 0;
				dfs(i);
			}
		for (int i = 0; i < R; i++)
			vis[i] = -1;
		cnt = 0;
		for (int i = 0; i < R; i++)
			if (vis[i] == -1){
				dfsp(i);
				cnt++;
			}
		for (int i = 0; i < Q; i++){
			int x, y;
			scanf ("%d%d", &x, &y);
			x--; y--;
			if(vis[x] == vis[y])
				printf("Y\n");
			else
				printf("N\n");
		}
		printf ("-\n");
	}
	return 0;
}


Create a new paste based on this one


Comments: