• 欧拉回路+图的连通性


    (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;
    }
    



     

  • 相关阅读:
    UVA 1600
    P3366 【模板】最小生成树(堆优化prim)
    P2414 [NOI2011]阿狸的打字机
    P2322 [HNOI2006]最短母串问题
    P4052 [JSOI2007]文本生成器
    P4824 [USACO15FEB]Censoring (Silver) 审查(银)&&P3121 [USACO15FEB]审查(黄金)Censoring (Gold)
    P3966 [TJOI2013]单词
    P2444 [POI2000]病毒
    P3294 [SCOI2016]背单词
    P2922 [USACO08DEC]秘密消息Secret Message
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3265222.html
Copyright © 2020-2023  润新知