HDU 欧拉回路

来源:互联网 发布:无法连接到网络1-10087 编辑:程序博客网 时间:2024/05/22 08:25
Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?


Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。


Output
每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。



Sample Input
3 3
1 2
1 3
2 3
3 2
1 2
2 3
0


Sample Output
1

0

判断欧拉回路的条件

无向图存在欧拉回路的充要条件
一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
有向图存在欧拉回路的充要条件
一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。

第一次使用vector库

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>#include<vector>#include<queue>#include<stack>using namespace std;#define ll long longconst double Inf=1e+9;vector <int> edge[1001];bool vis[1001];int e[1001];   //记录度数void dfs(int start){   //判断是否连通    int i,p;    vis[start]=true;    for (i=0;i<edge[start].size();i++)        {            p=edge[start][i];            if (!vis[p])                dfs(p);        }}int main(){    int i,a,b,m,n;    while (~scanf("%d",&m),m)    {        for (i=1;i<=m;i++)        {   //初始化            e[i]=0;            vis[i]=false;            edge[i].clear();        }        scanf("%d",&n);        for (i=1;i<=n;i++)            {                scanf("%d%d",&a,&b);                if (a!=b)                {                    edge[a].push_back(b);                    edge[b].push_back(a);                    e[a]++,e[b]++;                }            }            int flag=1;            for (i=1;i<=m;i++)                if (e[i]%2)            {                printf("0\n");                flag=0;                break;            }            if (flag)            {                dfs(1);                for (i=1;i<=m;i++)                    if (vis[i]==false)                {                    flag=0;                    printf("0\n");                    break;                }            }            if (flag)            printf("1\n");    }    return 0;}
输出欧拉回路路径

#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<stack>;using namespace std;int map[500][500],vis[500][500];int m,n;typedef struct node{    int x,y;}node;stack<node>q;node a;void euler(int u){    int i;    for (i=1;i<=n;i++)      if (map[u][i]&&!vis[u][i])      {          vis[u][i]=vis[i][u]=1;          euler(i);          a.x=u;          a.y=i;         q.push(a);      }}int main(){    int i,s,e;    node a;    scanf("%d%d",&n,&m);    for (i=1;i<=m;i++)        {            scanf("%d%d",&s,&e);            map[s][e]=map[e][s]=1;        }        euler(1);        while (!q.empty())        {            a=q.top();            printf("%d %d\n",a.x,a.y);            q.pop();        }    return 0;}



0 0
原创粉丝点击