zoukankan      html  css  js  c++  java
  • 欧拉回路

    若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为欧拉路径。若该路径是一个圈,则称为欧拉(Euler)回路。
    具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图。
    无向图存在欧拉回路的充要条件:一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
    有向图存在欧拉回路的充要条件:一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。
    题目:
    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
    C++代码如下:
    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<string>
    #include<stdio.h>
    using namespace std;
    #define maxLen 1001
    class node{
    public:
        vector<int> list; //用邻接表来存储图
        int count(){
            return list.size();
        }
        void push(int index){
            list.push_back(index);
        }
        int pop(){
            int index = list.back();
            list.pop_back();
            return index;
        }
        void clear(){
            list.clear();
        }
    };
    int main(){
        int N;
        int M;
        vector<int> result;
        node vertex[maxLen+1];//从下表1开始
        while (true){
            cin >> N;
            if (N == 0){
                break;
            }
            else{
                cin >> M;
                for (int i = 0; i < M; ++i){
                    int v1, v2;
                    cin >> v1 >> v2;
                    vertex[v1].push(v2);
                    vertex[v2].push(v1);
                }
                int j;
                for (j = 0; j < N; ++j){
                    if (vertex[j].count() % 2 != 0){
                        break;
                    }
                }
                if (j == N){
                    result.push_back(1);
                }
                else{
                    result.push_back(0);
                }
            }
        }
        for (int i = 0; i < result.size(); ++i){
            cout << result[i] << endl;
        }
        system("pause");
        return 0;
    }
     
     
  • 相关阅读:
    Java字符串跟ASCII码互转
    java 一款可以与ssm框架完美整合的web报表控件
    使用<c:set>标签配置项目路径
    Linux下部署tomcat及tomcat war包应用程序
    支付宝app支付服务端流程
    文本数据增量导入到mysql
    java 读取mysql中数据 并取出
    实现读取文本数据,在将数据导入mysql
    给一个整形数组,给出一个值,当这个值是数组某些数字的和,求出数组下标的值
    文本数据和mysql 里面的数据比较
  • 原文地址:https://www.cnblogs.com/codeDog123/p/6668166.html
Copyright © 2011-2022 走看看