zoukankan      html  css  js  c++  java
  • #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);
        }
    }
  • 相关阅读:
    「Luogu」2831愤怒的小鸟 (DFS+dp)
    LeetCode习题集
    递归的时间复杂度你真的懂吗?不是所有的二分递归都是logn级别
    [数据结构篇]谈一谈优先队列吧!
    论文爱好者(我不是)的福利
    Python 读微博留言进行情感分析(文本分类)
    python 多进程中的p.apply_async()
    记录本科论文开题报告修改过程
    KMP字符串匹配算法
    Pandas Timedelta
  • 原文地址:https://www.cnblogs.com/acmLLF/p/13713933.html
Copyright © 2011-2022 走看看