Codeforces

题意:

  以每个点为起点,找到第一个出现两次的点

解析:

  我是先找出来所有的环  环上的点找出来的肯定是自己 bz[i]  = i;

然后去遍历不在环上的点j  如果通过这个点找到一个已经标记的的点i  那么bz[j] = bz[i];

行吧。。。其实直接暴力 就几行代码。。。真是的。。。过分。。。。我真是垃圾啊。。啦啦啦。。。呸。。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010, INF = 0x7fffffff;
vector<int> G[maxn];
vector<int> f;
int vis[maxn], bz[maxn], a[maxn];
int s, t, tmp;
void dfs1(int u)
{
    vis[u] = 1;
    for(int i=0; i<G[u].size(); i++)
    {
        int v = G[u][i];
        if(!vis[v])
            dfs1(v);
        else if(u != v)
        {
            s = v;        
            tmp = u;
            return;
        }
        else
        {
            bz[v] = v;
            return;
        }
    }
    if(u == s)
        t = tmp;
}

void dfs2(int u)
{
    bz[u] = u;
    if(u == t) return;
    for(int i=0; i<G[u].size(); i++)
        dfs2(G[u][i]);
}

int dfs3(int u)
{
    if(bz[u]) return bz[u];
    for(int i=0; i<G[u].size(); i++)
        return dfs3(G[u][i]);
}


int main()
{
    int n, v;
    cin>> n;
    for(int i=1; i<=n; i++)
    {
        cin>> a[i];
        G[i].push_back(a[i]);
    }
    for(int i=1; i<=n; i++)
        if(!vis[i])
        {
            s = t = tmp = INF;
            dfs1(i);
            if(s != INF && t != INF)        
                dfs2(s);
        }
    for(int i=1; i<=n; i++)
    {
        if(bz[i]) continue;
        else
            bz[i] = dfs3(i);
    }
    for(int i=1; i<=n; i++)
        cout<< bz[i] << " ";
    cout<<endl;
    
    return 0;
}
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
原文地址:https://www.cnblogs.com/WTSRUVF/p/9623066.html