您的位置:首页 > 其它

hdu 1878 欧拉回路

2015-07-22 20:50 357 查看
欧拉路径是指在图中每个边只遍历一遍 能够走完所有边

欧拉回路是欧拉路径且最后起点和终点重合

判断一个无向图中是否存在欧拉回路的充要条件是 每个顶点的度都是偶数且为连同图

一个有向图是否为欧拉图的充要条件为 每个顶点的出度等于入度 且为连通图

下面的题目在判断时很简单 只用了一次bfs就判断了图的连通性

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1878

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
using namespace std;
const int maxn=1010;
int g[maxn][maxn];
int angle[maxn];//每个顶点的度
int vis[maxn];//bfs中的访问标志
int n,m;//n为顶点个数 m为边的个数
bool judge()
{
for(int i=1;i<=n;i++)//检查每个顶点的度是都为偶数
if(angle[i]&1)
return false;
memset(vis,0,sizeof(vis));//清空访问数组
queue<int> q;//用bfs检查无向图的连同性
int empty;
q.push(1);
while(!q.empty())
{
empty=q.front();
q.pop();
vis[empty]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&g[empty][i])//如果i点没有被访问过 且和empty顶点相连则压入栈
{
q.push(i);
}
}
}
for(int i=1;i<=n;i++)//检查图的连通性
if(!vis[i])return false;
return true;
}
int main(int argc,char *argv[])
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)break;
scanf("%d",&m);
int a,b;
memset(g,0,sizeof(g));//输入矩阵清空
memset(angle,0,sizeof(angle));//度清空
for(int i=0;i<m;i++)//输入m个边
{
scanf("%d %d",&a,&b);
g[a][b]=g[b][a]=1;
angle[a]++;
angle[b]++;
}
if(!judge())puts("0");
else puts("1");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: