现在的位置: 首页 > 综合 > 正文

UVA10054 The Necklace

2013年08月24日 ⁄ 综合 ⁄ 共 957字 ⁄ 字号 评论关闭

深不可测的黑洞

呼~~终于把它A掉了

这道题是判断是否存在欧拉回路的,把颜色看成点,珍珠看成边,然后统计每一个点的度,如果有奇度就表明欧拉回路不存在,如果存在的话直接dfs出欧拉回路,然后扔到栈里最后直接输出就行了。(仰慕佳哥)

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <iostream>
using namespace std;
const int N = 55;
int g[N][N], dg[N];
stack<pair<int, int> >st;
int is_euler(int mn){
	int s = -1;
	for (int i = 1; i <= mn; i++){
		if (dg[i]){
			if (s == -1) s = i;
			if (dg[i] % 2) return -1;
		}
	}
	return s;
}
void dfs(int cur, int mn){
	for (int i = 1; i <= mn; i++){
		if (g[cur][i]){
			g[cur][i] -= 1; g[i][cur] -= 1;
			dfs(i, mn);
			st.push(make_pair(cur, i));
		}
	}
}
int main(){
    //freopen("out.txt", "w", stdout);
	int cs, n;
	scanf("%d", &cs);
	for (int p = 1; p <= cs; p++){
	    memset(g, 0, sizeof(g));
	    memset(dg, 0, sizeof(dg));
		if (p > 1) printf("\n");
		scanf("%d", &n);
		int x, y, mn = 0;
		for (int i = 0; i < n; i++){
			scanf("%d%d", &x, &y);
			g[x][y] += 1; g[y][x] += 1;
			dg[x] += 1; dg[y] += 1;
			mn = max(mn, max(x, y));
		}
		int f = is_euler(mn);
		printf("Case #%d\n", p);
		if (f == -1){
			puts("some beads may be lost");
		}
		else{
			dfs(f, mn);
			while(!st.empty()){
				printf("%d %d\n", st.top().first, st.top().second);
				st.pop();
			}
		}
	}
	return 0;
}

抱歉!评论已关闭.