• USACO fence


      题目的意思就是给你一个图, 输出他的欧拉路(欧拉通路 或者 欧拉回路),无向图欧拉回路判断条件是:1:图连通 2:所有点的度数为偶数     无向图欧拉通路的条件是:1:图连通 2:有且只有两个点的度数为奇数, 不过寻找欧拉路的代码是一样的,学习了新的建图方法,代码如下:

    /*
        ID: m1500293
        LANG: C++
        PROG: fence
    */
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    
    using namespace std;
    struct edge
    {
        int a, b, used;
        edge() {}
        edge(int a, int b, int used):a(a), b(b), used(used) {}
        int other(int x)
        {
            return x==a?b:a;
        }
    }e[1100];
    int F;    //边的数量
    vector<int> G[510];
    int node[510], nodenum, exist[510];
    int degree[510];
    vector<int> ans;
    
    void dfs(int u)                  
    {
        for(int i=0; i<G[u].size(); i++)
        {
            edge &tp = e[G[u][i]];
            if(!tp.used)
            {
                tp.used = 1;
                dfs(tp.other(u));
            }
        }
        ans.push_back(u);
    }
    
    struct cmp                  //高明
    {
        int x;
        cmp() {}
        cmp(int x):x(x) {}
        bool operator()  (const int &a, const int &b) const
        {
            return e[a].other(x)<e[b].other(x);
        }
    };
    
    int main()
    {
        //freopen("fence.in", "r", stdin);
        //freopen("fence.out", "w", stdout);
        memset(degree, 0, sizeof(degree));
        memset(exist, 0, sizeof(exist));
        nodenum = 0;
        scanf("%d", &F);
        for(int i=0; i<F; i++)
        {
            int u, v;
            scanf("%d%d", &u, &v);
            if(!exist[u]) node[nodenum++] = u,  exist[u]=1;
            if(!exist[v]) node[nodenum++] = v,  exist[v]=1;
            degree[u]++; degree[v]++;
            e[i] = edge(u, v, 0);
            G[u].push_back(i);
            G[v].push_back(i);
        }
        sort(node, node+nodenum);
        for(int i=0; i<nodenum; i++)
            sort(G[node[i]].begin(), G[node[i]].end(), cmp(node[i]));
        int start = 0x3fffffff;
        for(int i=0; i<nodenum; i++)
            if(degree[node[i]]%2==1)
                start = min(start, node[i]);
        if(start == 0x3fffffff)
            start = node[0];
        dfs(start);
        for(int i=ans.size()-1; i>=0; i--)    //逆序输出
            printf("%d
    ", ans[i]);
        return 0;
    }
  • 相关阅读:
    移动端和pc端的判断,不同端做不同的处理
    easyUI combobox的使用
    [Codeforces #196] Tutorial
    [Codeforces #174] Tutorial
    [Codeforces #190] Tutorial
    [Codeforces #211] Tutorial
    [Codeforces #192] Tutorial
    [BZOJ 3196] 二逼平衡树
    [BZOJ 1058] 报表统计
    [P3709] 大爷的字符串题
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5093676.html
Copyright © 2020-2023  润新知