hdu 1878 欧拉回路

欧拉路径是指在图中每个边只遍历一遍 能够走完所有边
欧拉回路是欧拉路径且最后起点和终点重合
判断一个无向图中是否存在欧拉回路的充要条件是 每个顶点的度都是偶数且为连同图
一个有向图是否为欧拉图的充要条件为 每个顶点的出度等于入度 且为连通图
下面的题目在判断时很简单 只用了一次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;
}

你可能感兴趣的:(图)