hdu 1878 欧拉回路

来源:互联网 发布:mac os x 最新版本 编辑:程序博客网 时间:2024/06/10 10:37

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