UVA 10054 项链

欧拉回路:

如果连通图中顶点的入度全部为偶数则欧拉回路存在

参考:http://blog.sina.com.cn/s/blog_6f846a6e0100vzdo.html

注意欧拉回路的打印技巧

下面这个代码虽然AC,但是由于UVA测试数据图全部连通的缘故,应当判断图是否连通

#include<stdio.h> 
#include<string.h> 
int g[60][60]; 
int num[60]; 
void dfs(int x) 
{ 
     int i; 
     for(i = 1; i <= 50; i ++) 
     if(g[x][i]) 
    { 
              g[x][i] --; 
              g[i][x] --; 
              dfs(i); 
              printf("%d %d\n", i, x); 
      } 
} 
 
int main() 
{ 
	freopen("F:\\input.txt","r",stdin );
    int t; 
    int a, b; 
    int n, max, sum, count; 
    int i, start, temp, x; 
    int cas = 0; 
    while(scanf("%d", &t)!= EOF) 
   { 
            for(x = 0; x < t; x ++) 
           { 
                 scanf("%d", &n); 
                 max = 0; 
                 sum = 0;             
                 memset(g, 0, sizeof(g)); 
                 memset(num, 0, sizeof(num)); 
                 while(n --) 
                 {     
                           scanf("%d%d", &a, &b); 
                           { 
                                  g[a][b]  ++; 
                                  g[b][a] ++; 
                                  num[a] ++; 
                                  num[b] ++; 
                                 sum += 2; 
                            } 
                 } 
                 int flag = 1; 
                 for(i = 1; i <= 50; i ++) 
                 if(num[i] % 2 == 1) 
                 { 
                         flag = 0; 
                         break; 
                  } 
                  else if(num[i] > max) 
                 { 
                         max = num[i]; 
                         start = i; 
                  } 
                 if(x)printf("\n"); 
                 printf("Case #%d\n", ++cas); 
                 if(flag) 
                       dfs(start); 
                 else  
                       printf("some beads may be lost \n"); 
             } 
             return 0; 
        }    
} 


弄复杂的错误的WA

//state:Wrong Answer
#include<iostream>
#include<cstdio>
#include<cstring>
#include<memory>
#include<queue>
#include<algorithm>
#include<string>
#include<cmath>
#include<stack>
using namespace std;

///
#define Maxn 1010
bool maze[Maxn][Maxn];
bool vis[Maxn][Maxn];
bool used[Maxn];
int inEdges[Maxn];
int outEdges[Maxn];
int degrees[Maxn];
int N;
int nNodes;
struct beads{
	int color1;
	int color2;
};
stack<beads> stk;

bool dfs(int start, int total)
{
	if (total == nNodes)
		return true;
	int i;
	used[start] = true;
	for (i = 0; i < Maxn; i++)
	{
		if ( (maze[start][i]) && (!used[i]) )
		{
			if (dfs(i, total + 1))
				return true;
		}
	}
	return false;
}
void euler(int u)
{
	int i;
	for (i = 0; i < Maxn; i++)
	{
		if (maze[u][i] && !vis[u][i])
		{
			vis[u][i] = vis[i][u] = true;
			euler(i);
//			cout << u <<" "<< i << endl;
			beads temp;
			temp.color1 = u;
			temp.color2 = i;
			stk.push(temp);
		}
	}
}

int main()
{
	freopen("F:\\input.txt","r",stdin );
	///
	int i, j;
	int nCases;
	int testnum = 0;

	cin >> nCases;
	while (nCases--)
	{
		testnum++;
		memset(maze, 0, sizeof(maze));
		memset(vis, 0, sizeof(vis));
		memset(used, 0, sizeof(used));
		memset(inEdges, 0, sizeof(inEdges));
		memset(outEdges, 0, sizeof(outEdges));
		memset(degrees, 0, sizeof(degrees));
		nNodes = 0;
		while (!stk.empty())
			stk.pop();
		if (testnum != 1)
			cout << endl;
		cout << "Case #" << testnum << endl;
		cin >> N;
		for (i = 0; i < N; i++)
		{
			int from, to;
			cin >> from >> to;
			maze[from][to] = maze[to][from] = true;
			inEdges[to]++;
			outEdges[from]++;
			degrees[from]++;
			degrees[to]++;
			if (!used[from])
			{
				nNodes++;
				used[from] = true;
			}
			if (!used[to])
			{
				nNodes++;
				used[to] = true;
			}
		}
		memset(used, 0, sizeof(used));
		int pos;
		for (pos = 0; pos < Maxn; pos++)
		{
			if (outEdges[pos] != 0)  //第一个输出的
				break;
		}
		if (!dfs(pos, 1))
		{
			cout << "some beads may be lost" << endl;
			continue;
		}
		int special = 0;
		for (i = 0; i < Maxn; i++)
		{
			if (degrees[i] % 2 != 0)
			{
				special = -1;
				break;
			}
		}
		if (special == 0)
		{
			euler(pos);
			while (!stk.empty())
			{
				beads temp;
				temp = stk.top();
				stk.pop();
				cout << temp.color1 << " " << temp.color2 << endl;
			}
		}
		else
			cout << "some beads may be lost" << endl;
		
	}

	///
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值