• #10109. 「一本通 3.7 练习 3」John's Trip


     题解:

    题意比较绕,写出模型

    街是边,路口是点,

    自环在DFS里无所谓(重边也无所谓)

    然后显然是个欧拉回路 ,(走过所有边回到起点)

    然后图保证联通,只要判断能不能构成欧拉回路就行了

    然后发现LOJ居然没pe,pe是直接wa,难受啊马飞

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define io std::ios::sync_with_stdio(false)
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pii;
    const int P = 1e9+7, INF = 0x3f3f3f3f;
    const int maxn=2000;
    ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    ll qpow(ll a,ll n){ll r=1%P;for (a%=P; n; a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
    int _next[maxn*2],head[maxn],tot,to[maxn*2];
    int id[maxn*2];
    void add(int x,int y,int z)
    {
        _next[++tot]=head[x],head[x]=tot,to[tot]=y,id[tot]=z;
        //_next[++tot]=head[y],head[y]=tot,to[tot]=x;
    }
    int cnt;
    int ans[maxn];
    int vis[maxn];
    void dfs(int u)
    {
        for(int &i=head[u];i;i=_next[i])
        {
    
            int v=to[i];
            int dd=id[i];
            if(!vis[dd])
            {
                vis[dd]++;
                dfs(v);
                ans[cnt++]=dd;
            }
        }
    }
    int in[maxn];
    int flag=0;
    int main()
    {
        int s;
        int num=0;
        int x,y,z;
        while(cin>>x>>y)
        {
            if(!x&&!y)
            {   if(num==0)
                break;
                dfs(s);
                for(int i=1;i<=44;i++)
                {
    
                    if(in[i]%2==1)
                    {
                        flag=1;
                        break;
                    }
                }
                if(flag)
                cout<<"Round trip does not exist."<<endl;
                else
                {
                for(int i=0;i<cnt;i++)
                {
    
                cout<<ans[i];
                if(i!=cnt-1)
                    cout<<' ';
                }
                cout<<endl;
                }
                for(int i=1;i<=50;i++)
                {
                    head[i]=0;
                    in[i]=0;
                }
                memset(vis,0,sizeof(vis));
                cnt=0;
                tot=0;
                num=0;
                flag=0;
                continue;
            }
            cin>>z;
            add(x,y,z);
            add(y,x,z);
            in[x]++;
            in[y]++;
            num++;
            if(num==1)
            s=min(x,y);
        }
    }
  • 相关阅读:
    oracle常用命令
    批量导出docker镜像
    python中的xpath
    __call__, __str__
    闭包
    ORM操作
    nginx跨域请求
    docker-compose命令
    nginx 之 websocket长连接
    nginx--proxy_set_header
  • 原文地址:https://www.cnblogs.com/acmLLF/p/13713933.html
Copyright © 2020-2023  润新知