欧拉回路+图的连通性

(1) 什么是欧拉路径和欧拉回路

简单说:一笔画问题就是欧拉路径和回路问题,可以一笔(不回笔)把一个图完整的画出来,路径就是欧拉路径,如果这个路径成环,那么就是欧拉回路。【就是要遍历完所有的边】

(2)判断欧拉回路是否存在的方法

 

有向图:图连通,所有的顶点出度=入度。

无向图:图连通,所有顶点都是偶数度。

(3)涉及图的连通性,图的连通性常用几种算法(个人YY,欢迎补充)

    a.DFS 

      o(n^2)的复杂度

       。。。。。。

    b.弗洛伊德算法(最短路算法)

     o(n^3)  贴一下软设代码。。。。。。

#include <iostream>

using namespace std;

#define inf 0x3f3f3f3f

struct graph

{

    int n,e;

    int mat[101][101];

};

struct graph  C;

void setgraph()

{

    int m,n,x;

    cin >> C.n >> C.e;

    for(int i=1; i<=C.n; i++)

        for(int j=1; j<=C.n; j++)

            C.mat[i][j]= inf;

    for(int i=1; i<=C.e; i++)

    {

        cin >> m >> n >> x;

        C.mat[m][n]=x;

    }

}

void Floyd()

{

    int d[101][101];

    for(int i=1; i<=C.n; i++)

        for(int j=1; j<=C.n; j++)

            d[i][j]=C.mat[i][j];

    for(int k=1; k<=C.n; k++)

        for(int i=1; i<=C.n; i++)

            for(int j=1; j<=C.n; j++)

                d[i][j]=min(d[i][k]+d[k][j],d[i][j]);

     //floyd

    for(int i=1; i<=C.n; i++)

    {

        for(int j=1; j<=C.n; j++)

           {

               if(d[i][j]==inf)  cout << "∞" << " ";

               else  cout <<  d[i][j] << " ";

           }

        cout << endl;

    }//print

}

int main()

{

    setgraph();

    Floyd();

    return 0;

}

  c.并查集

 

-----------------------------------------------------

 

题目描述:
    欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结束。
输出:
    每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
样例输入:
3 3

1 2

1 3

2 3

3 2

1 2

2 3

0
样例输出:
1

0
来源:
2008年浙江大学计算机及软件工程研究生机试真题

-----------------------------------------------------------------------

 

 

#include <iostream>

#include<cstdio>

using namespace std;

int p[1003],d[1003];

int f(int x)

{

    return p[x]==x?x:p[x]=f(p[x]);//注意这里的p[x]=f(p[x]),再压缩一下,嘿嘿。。。

}

int main()

{

    int n,m,a,b,f2,f1;

    while(scanf("%d",&n)!=EOF&&n)

    {

        f2=f1=0;

        for(int i=0;i<n;i++)

        {

            d[i]=0;

            p[i]=i;

        }

        cin >> m;

        for(int i=0; i<m; i++)

        {

            cin >> a >> b;

            p[f(a--)]=p[f(b--)];

            d[a]++;

            d[b]++;

        }

        for(int i=0; i<n; i++)

        {

            if(p[i]==i) f1++;

            if(d[i]%2==1|| d[i]==0) f2++;

        }

        if(f1==1&&f2==0) cout << 1 << endl;

        else cout<< 0 << endl;

    }

    return 0;

}



 

 

 

你可能感兴趣的:(图)