您的位置:首页 > 其它

PC/UVa 111002/10054 The Necklace

2011-04-20 00:22 555 查看
这题就是无向图的欧拉回路问题,要注意的是:(1)图要是连通的,(2)欧拉回路/欧拉路径的输出

下面代码在uva上提交是ac的,,但不知道为什么在pc上是wa。。求大牛指导~

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

const int maxn = 51;
int g[maxn][maxn];

bool vis[maxn];
bool app[maxn];
int deg[maxn];
int n;

void dfs(int cur)
{
for(int i = 1; i < maxn; i++)
if(g[cur][i] && !vis[i])
{
vis[i] = true;
dfs(i);
}
}
bool isconnected()
{
for(int i = 1; i < maxn; i++)
if(app[i])
{
vis[i] = true;
dfs(i);
break;
}
for(int i = 1; i < maxn; i++)
if(app[i] && !vis[i])
return false;
return true;
}

bool iseuler()
{
for(int i = 1; i < maxn; i++)
if(app[i] && deg[i]%2)
return false;
return true;
}

void euler(int u)
{
for(int v = 1; v < maxn; v++)
if(g[u][v])
{
g[u][v]--;
g[v][u]--;

euler(v);
printf("%d %d/n", v, u);
}
}
#define LOCAL
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int test;
scanf("%d", &test);

for(int t = 0; t < test; t++)
{
if(t)
printf("/n");

printf("Case #%d/n", t+1);
scanf("%d", &n);

memset(g, 0, sizeof(g));
memset(vis, false, sizeof(vis));
memset(app, false, sizeof(app));
memset(deg, 0, sizeof(deg));

for(int i = 0; i < n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
g[a][b]++;
g[b][a]++;
app[a] = app[b] = true;

deg[a]++;
deg[b]++;
}

if(isconnected() && iseuler())
{
for(int i = 1; i < maxn; i++)
if(app[i])
{
euler(i);
break;
}
}
else
printf("some beads may be lost/n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: