zoukankan      html  css  js  c++  java
  • Noip2018旅行

    #include <algorithm>
    #include <cctype>
    #include <cmath>
    #include <complex>
    #include <cstdio>
    #include <cstring>
    #include <deque>
    #include <functional>
    #include <list>
    #include <map>
    #include <iomanip>    
    #include <iostream>
    #include <queue>
    #include <set>
    #include <stack>
    #include <string>
    #include <vector>
    #define R register
    using namespace std;
    typedef long long ull;
    const int maxn = 5e3 + 100;
    
    inline int read() 
    {
        int s = 0, w = 1;
        char ch = getchar();
        while (!isdigit(ch)) { if (ch == '-') w = -1; ch = getchar(); }
        while (isdigit(ch)) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
        return s * w;
    }
    
    inline void write(int x)
    {
        if(x < 0) putchar('-'),x = -x;
        if(x > 9) write(x / 10);
        putchar(x % 10 + '0');
    }
    
    vector <int> vec[maxn];
    int ans[maxn], edge[maxn][2], t[maxn], vis[maxn];
    int n, m, da, db, tsize = 0;
    
    inline void dfs(int x) 
    {
        t[++tsize] = x; 
        vis[x] = 1;
        int l = vec[x].size();
        for (R int i = 0; i < l; ++i) 
        {
            int y = vec[x][i];
            if (!vis[y] && !((x == da && y == db) || (x == db && y == da))) 
            //如果y点没有走过,且要走的边,不是删去的边 
               dfs(y);
        }
        return ;
    }
    
    inline void check() 
    {
        if (tsize != n) return ;
        for (R int i = 1; i <= n; ++i) 
        {
            if (t[i] != ans[i]) 
            {
                if (t[i] > ans[i]) return ;
                break;
            }
        }
        for (R int i = 1; i <= n; ++i) 
        {
            ans[i] = t[i];
        }
        return ;
    }
    
    int main() 
    {
        memset(ans, 0x3f, sizeof(ans));
        n = read(), m = read();
        for (R int i = 1; i <= m; ++i) {
            int a = read(), b = read();
            vec[a].push_back(b);
            vec[b].push_back(a);
            edge[i][0] = a;
            edge[i][1] = b;
        }
        for (R int i  = 1; i <= n; ++i) 
             sort(vec[i].begin(), vec[i].end());
        if (n > m) 
        {
            da = -1, db = -1;
            dfs(1);
            check();
        }
        else {
            for (R int i = 1; i <= m; ++i) 
            {
                tsize = 0;
                da = edge[i][0];
                db = edge[i][1];
                memset(vis, 0, sizeof(vis));
                dfs(1);
                check();
            }
        }
        for (R int i = 1; i <= n-1; ++i) write(ans[i]), putchar(' ');
        write(ans[n]);
        return 0;
    }
    
    
    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #include <vector>
    using namespace std;
    const int N=5005;
    const int INF=0x7fffffff/2;
    vector<int> G[N];
    vector<int> temp,ans;
    int du[N],cst,ced;
    int n,m,pt,vis[N],nxt[N];
    int f[N],st;
    void Add(int x,int y) 
    {
        G[x].push_back(y);
    }
    void Dfs(int x,int prt) 
    {
        ans.push_back(x);
        for (int i=0;i<du[x];i++) 
        {
            int y=G[x][i];
            if (y==prt) continue;
            Dfs(y,x);
        }
    }
    void FindCircle(int x,int prt) 
    {
        vis[x]=1;
        for (int i=0;i<du[x];i++) {
            int y=G[x][i];
            if (y==prt) 
                continue;
            if (vis[y]&&!pt) //如果y已访问过且从前未找到过环时 
            {
                nxt[x]=y;
                f[x]=1;//y在环上 
                pt=1;
                st=y;//环的开始点为y 
            } 
            else if (!vis[y]) 
            {
                FindCircle(y,x);
                if (pt&&f[y]) //如果找到环且y在环上 
                {
                    nxt[x]=y;
                    f[x]=1;
                }
            }
        }
        if (x==st) 
            pt=0;
    }
    void Dfs2(int x,int prt) 
    {
        temp.push_back(x);
        for (int i=0;i<du[x];i++) 
        {
            int y=G[x][i];
            if (y==prt) continue;
            if ((x==cst&&y==ced)||(y==cst&&x==ced)) continue;
            Dfs2(y,x);
        }
    }
    int main() 
    {
      
        scanf("%d%d",&n,&m);
        for (int i=1;i<=m;i++) 
        {
            int u,v;
            scanf("%d%d",&u,&v);
            Add(u,v);
            Add(v,u);
        }
        for (int i=1;i<=n;i++) 
        {
            sort(G[i].begin(),G[i].end());
            du[i]=G[i].size();
        }
        if (m==n-1) 
        {
            Dfs(1,0);
            for (int i=0;i<n-1;i++) printf("%d ",ans[i]);
            printf("%d",ans[n-1]);
        } else 
        {
            pt=0;
            FindCircle(1,0);
            int rt=st;
            for (int i=1;i<=n;i++) 
                ans.push_back(INF);
            do 
            {
                cst=rt;
                ced=nxt[rt];
                temp.clear();
                Dfs2(1,0);
                rt=nxt[rt];
                if (ans>temp) 
                ans=temp;
            } 
            while (st!=rt);
            for (int i=0;i<n-1;i++) 
                printf("%d ",ans[i]);
            printf("%d",ans[n-1]);
        }
        return 0;
    }
  • 相关阅读:
    UOJ425【集训队作业2018】strings【分块,常数优化】
    UOJ444【集训队作业2018】二分图【构造,结论】
    各种类型转换为字符串类型(ToString())
    ADO.net数据绑定
    关于扫雷游戏学习笔记(二)
    关于扫雷游戏学习笔记(一)
    Luogu P2864 [USACO06JAN]树林The Grove(bfs)
    Luogu P1712 [NOI2016]区间(线段树)
    Luogu P2051 [AHOI2009]中国象棋(dp)
    Luogu P2577 [ZJOI2005]午餐(dp)
  • 原文地址:https://www.cnblogs.com/cutemush/p/11688591.html
Copyright © 2011-2022 走看看