您的位置:首页 > 其它

Nyoj 42 一笔画问题

2014-04-04 08:45 281 查看
题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=42

无向图G存在欧拉通路的充要条件是:G为连通图,并且G仅有两个奇度顶点(度数为奇数的顶点),或者无奇度顶点

当然可用并查集来解,找出奇度顶点的个数,记录集合的个数,然后根据充要条件判断!

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int MAXN = 1010;

int parent[MAXN];
int kcount[MAXN];

void Inite_Tree()
{
for(int i = 1; i < MAXN; ++i)
{
parent[i] = i;
kcount[i] = 1;
}
return ;
}
/**
int Find_Parent(int x)//递归求根
{
if(x != parent[x])
parent[x] = Find_Parent( parent[x] );

return parent[x];
}
*/

int Find_Parent(int x)//非递归求根
{
int s;
for(s = x; s != parent[s]; s = parent[s])
;
while(x != s)
{
int tmp = parent[x];
parent[x] = s;
x = tmp;
}
return s;
}

void Union_Set(int x, int y)
{
int r1 = Find_Parent( x );
int r2 = Find_Parent( y );
int tmp = kcount[r2] + kcount[r1];
if(kcount[r1] > kcount[r2])
{
parent[r2] = r1;
kcount[r1] = tmp;
}
else
{
parent[r1] = r2;
kcount[r2] = tmp;
}
}

int main()
{
int T, num, setnum;
int n, m;
int u, v;
int degree_Of_Vertex[MAXN];
scanf("%d", &T);
while(T--)
{
memset(degree_Of_Vertex, 0, sizeof(degree_Of_Vertex));
Inite_Tree();
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; ++i)
{
scanf("%d %d", &u, &v);
degree_Of_Vertex[u]++;
degree_Of_Vertex[v]++;

if(Find_Parent(u) != Find_Parent(v))
Union_Set(u, v);
}
num = 0, setnum = 0;
for(int i = 1; i <= n; ++i)
{
if(degree_Of_Vertex[i] % 2)
num++;
if(parent[i] == i)
setnum++;
}
if((num == 0 || num == 2) && setnum == 1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}


深搜:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int MAXN = 1010;
int Graph[MAXN][MAXN];
bool visit[MAXN];

int degree[MAXN];
int n;

void DFS(int CurVertex)
{
visit[CurVertex] = true;
for(int i =1; i <= n; ++i)
{
if(Graph[CurVertex][i])
{
if(!visit[i])
DFS(i);
}
}
}

int main()
{
int T;
int m;
int u, v;
scanf("%d", &T);
while(T--)
{
memset(degree, 0, sizeof(degree));
memset(Graph, 0, sizeof(Graph));
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; ++i)
{
scanf("%d %d", &u, &v);
Graph[u][v] = 1;
Graph[v][u] = 1;
degree[u]++;
degree[v]++;
}
memset(visit, false, sizeof(visit));
DFS(1);
int num = 0;
bool flag = true;
for(int i = 1; i <= n; ++i)
{
if(visit[i] == false)
{
flag = false;
break;
}
if(degree[i] % 2)
num++;
}

if(!flag)
{
printf("No\n");
continue ;
}

if(num == 2 || num == 0)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: