10596 - Morning Walk(欧拉回路 + dfs)

题目:10596 - Morning Walk


题目大意:给R条路,看是否能每条路只一遍, 从起点到终点形成回路。


解题思路:每条路只能走一遍,且要求形成回路,这就是欧拉回路。对于无向图来说(因为是道路,不是有向的)。每个点的度都为偶数,且这个图是连通的, 这个图就一定是欧拉回路。


#include<stdio.h>
#include<string.h>

const int N = 205;
int G[N][N], num[N];

int n, r, x, y;
int flag;

void dfs(int u) {
	
	flag++;         //通过深度优先遍历访问到每个点,即图为连通。
	num[u] = 0;   
	for(int v = 0; v < n; v++) {

		if(G[u][v] && num[v]) 
			dfs(v);
	}
}

int main() {

	int i;
	while(scanf("%d%d", &n, &r) != EOF) {

		memset(G, 0, sizeof(G));
		memset(num, 0, sizeof(num));

		flag = 0;
		for	( i = 0; i < r; i++) {

			scanf("%d%d", &x, &y);
			G[x][y] ++;
			G[y][x] ++;
			num[x]++;
			num[y]++;

		}

		for( i = 0; i < n; i++)  //判断度是否都为偶数
			if(num[i] % 2 ) 
				flag = 1;
	
		if(flag)
			printf("Not Possible\n");
		else {

			dfs(x);  //判断这个图是否连通
			if(flag == n)
				printf("Possible\n");
			else
				printf("Not Possible\n");
				

		}
	}
	return 0;
}


你可能感兴趣的:(10596 - Morning Walk(欧拉回路 + dfs))