H - 数据结构实验之图论八:欧拉回路(DFS+欧拉图 )
发布日期:2021-05-04 14:45:21 浏览次数:40 分类:原创文章

本文共 1597 字,大约阅读时间需要 5 分钟。

Description

在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来。

能否走过这样的七座桥,并且每桥只走一次?瑞士数学家欧拉最终解决了这个问题并由此创立了拓扑学。欧拉通过对七桥问题的研究,不仅圆满地回答了哥尼斯堡七桥问题,并证明了更为广泛的有关一笔画的三条结论,人们通常称之为欧拉定理。对于一个连通图,通常把从某结点出发一笔画成所经过的路线叫做欧拉路。人们又通常把一笔画成回到出发点的欧拉路叫做欧拉回路。具有欧拉回路的图叫做欧拉图。
你的任务是:对于给定的一组无向图数据,判断其是否成其为欧拉图?

Input

连续T组数据输入,每组数据第一行给出两个正整数,分别表示结点数目N(1 < N <= 1000)和边数M;随后M行对应M条边,每行给出两个正整数,分别表示该边连通的两个结点的编号,结点从1~N编号。

Output

若为欧拉图输出1,否则输出0。

Sample

Input

16 101 22 33 14 55 66 41 41 63 43 6

Output

1

Hint

如果无向图连通并且所有结点的度都是偶数,则存在欧拉回路,否则不存在。

注意:

1.记得清空数组2.记得判断图是否连通

答案:

#include <iostream>#include<bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3fconst int N = 1111;using namespace std;int mp[N][N];  //无向图int dp[N];     //记录度bool vis[N];   //标记数组int cnt;void DFS(int pos,int n)  //DFS判断是否连通{    vis[pos]=1;    cnt++;    int i;    for(i=1;i<=n;i++)    {        if(!vis[i]&&mp[pos][i])        {            DFS(i,n);        }    }}int main(){    ios::sync_with_stdio(0);    int t;    cin>>t;    while(t--)    {        memset(mp,0,sizeof(mp));  //清空数组        memset(dp,0,sizeof(dp));        memset(vis,0,sizeof(vis));        int n,m;        cin>>n>>m;        int x,y;        while(m--)        {            cin>>x>>y;            mp[x][y]=mp[y][x]=1;  //构建无向图            dp[x]++;  //记录x的度            dp[y]++;  //记录y的度        }        int i;        cnt=0;        DFS(1,n);  //判断是否连通        int flag=0;        for(i=1; i<=n; i++)        {            if(dp[i]%2)            {                flag=1;                break;            }        }        if(!flag&&cnt==n)            cout<<1<<endl;        else            cout<<0<<endl;    }    return 0;}
上一篇:I - 数据结构实验之图论九:最小生成树(模板题:Kruskal算法)
下一篇:G - 数据结构实验之图论七:驴友计划(最短路模板题Floyd算法/Dijkstra算法)

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月01日 16时26分44秒