zoukankan      html  css  js  c++  java
  • 模板|欧拉路径与欧拉回路

    1.判断无向图的欧拉回路和欧拉路径

    #include <iostream>
    #include <cstring>
    using namespace std;
    const int MAX_N = 100;
    const int MAX_M = 10000;
    struct edge {
        int v, next;
        int len;
    } E[MAX_M];
    int p[MAX_N], eid;
    void init() {
        memset(p, -1, sizeof(p));
        eid = 0;
    }
    void insert(int u, int v) {
        E[eid].v = v;
        E[eid].next = p[u];
        p[u] = eid++;
    }
    int n,m;
    int degree[MAX_N];
    int cnt;
    bool vis[MAX_N];
    void dfs(int u){
        vis[u] = true;
        cnt++;
        for(int i=p[u];i!=-1;i=E[i].next){
            int v = E[i].v;
            if(!vis[v]){
                dfs(v);
            }
        }
    }
    
    void euler(){
        dfs(1);
        if(cnt!=n){
    		cout<<"It doesn't have an euler path!"<<endl;
            return;
        }
        int cntodd = 0;
        for(int i=1;i<=n;i++){
    		if(degree[i]%2 == 1){
                cntodd++;
            }
        }
        if(cntodd == 0){
    		cout<<"It has an euler circuit!"<<endl;
        }else if(cntodd == 2){
            cout<<"It has an euler path!"<<endl;
        }else{
    		cout<<"It doesn't have an euler path!"<<endl;
        }
    }
    
    
    int main() {
        init();
        memset(degree,0,sizeof(degree));
        cin>>n>>m;
        for(int i=0;i<m;i++){
            int u,v;
            cin>>u>>v;
            insert(u,v);
            insert(v,u);
            degree[u]++;
            degree[v]++;
        }
        euler();
        return 0;
    }
    

    2.判断无向图的欧拉回路和欧拉路径

    #include <iostream>
    #include <cstring>
    using namespace std;
    const int MAX_N = 100;
    const int MAX_M = 10000;
    struct edge {
        int v, next;
        int len;
    } E[MAX_M];
    int p[MAX_N], eid;
    void init() {
        memset(p, -1, sizeof(p));
        eid = 0;
    }
    void insert(int u, int v) {
        E[eid].v = v;
        E[eid].next = p[u];
        p[u] = eid++;
    }
    
    int n,m;
    int degree[MAX_N];
    
    int euler(){
        int first = 0,last = 0;
        for(int i = 1;i <= n;i++){
            if(degree[i]<-1 || degree[i] > 1){
                cout<<"It doesn't have an euler path!"<<endl;
                return 0;
            }else if(degree[i] == -1){
                if(first != 0){
                    cout<<"It doesn't have an euler path!"<<endl;
                    return 0;
                }else{
                    first = i;
                }
            }else if(degree[i] == 1){
    			if(last != 0 ){
                    cout<<"It doesn't have an euler path!"<<endl;
                    return 0;
                }else{
                    last = i;
                }
            }
        }
        if(first == 0 && last == 0){
            cout<<"It has an eluer circuit!"<<endl;
            return 1;
        }else if(first != 0 && last != 0){
            cout<<"It has an euler path!"<<endl;
            return first;
        }
    }
    
    int main() {
        init();
        memset(degree,0,sizeof(degree));
        cin>>n>>m;
        for(int i=0;i<m;i++){
            int u,v;
            cin>>u>>v;
            insert(u,v);
            degree[u]--;
            degree[v]++;
        }
        euler();
        return 0;
    }
    

    3.找出有向图的欧拉回路

    #include <iostream>
    #include <cstring>
    #include <stack>
    using namespace std;
    const int MAX_N = 100;
    const int MAX_M = 10000;
    struct edge {
        int v, next;
        int len;
    } E[MAX_M];
    int p[MAX_N], eid;
    void init() {
        memset(p, -1, sizeof(p));
        eid = 0;
    }
    void insert(int u, int v) {
        E[eid].v = v;
        E[eid].next = p[u];
        p[u] = eid++;
    }
    int n, m;
    int degree[MAX_N];
    int euler() {
        int first = 0, last = 0;
        for (int i = 1; i <= n; i++) {
            if (degree[i] < -1 || degree[i] > 1) {
                return 0;
            } else if (degree[i] == -1) {
                if (first != 0) {
                    return 0;
                } else {
                    first = i;
                }
            } else if (degree[i] == 1) {
                if (last != 0) {
                    return 0;
                } else {
                    last = i;
                }
            }
        }
        if (first == 0 && last == 0) {
            return 1;
        } else if (first != 0 && last != 0) {
            return first;
        } else {
            return 0;
        }
    }
    
    stack<int> path;
    void dfs(int u){
    	while(p[u] != -1){
            int v = E[p[u]].v;
            p[u] = E[p[u]].next;//删除这条边就是把p[u]赋值位E[p[u]].next
            dfs(v);
        }
        path.push(u);
    }
    
    bool euler_find(){
        int start;
        start = euler();
        if(start == 0){
            return false;
        }else{
            dfs(start);
            return path.size() == m + 1;
        }
    }
    
    int main() {
        init();
        memset(degree,0,sizeof(degree));
        cin>>n>>m;
        for(int i=0;i<m;i++){
            int u,v;
            cin>>u>>v;
            insert(u,v);
            degree[u]--;
            degree[v]++;
    	}
        if(!euler_find()){
            cout<<"It doesn't have an euler path!"<<endl;
        }else{
            while(!path.empty()){
                cout<<path.top()<<endl;
                path.pop();
            }
        }
        return 0;
    }
    
  • 相关阅读:
    利用for循环 修改精灵图背景位置
    添加列表项 避免浏览器反复渲染 Fragment
    向元素添加属性名和属性值
    分割文本节点
    查询、回显 基本功能
    获取注释
    合并文本节点
    Node(节点)的4个操作方法
    setTimeout与setInterval
    javascript循环
  • 原文地址:https://www.cnblogs.com/fisherss/p/10683867.html
Copyright © 2011-2022 走看看