计蒜客刷题

最小环问题之信息传递

2018-03-05  本文已影响0人  任正非用甘油炸隔壁小王

首先定一个小小的目标,一个学期肝完计蒜客上所有的题目..
这是第一道题目 [题目链接]

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
using namespace std;
const int maxn=200005;
int input[maxn]; //record input
int record[maxn]= {}; //记录多少个数指向他
int  note[maxn]= {}; //标记是否剔除
queue<int>outman;
int n,ans=0;

void inputs()
{
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>input[i];
        record[input[i]]++;
    }
    ans=n;
}

int main()
{
    inputs();
    //第一步先剔除最开始的
    for(int i=1; i<=n; i++)
    {
        if(record[i]==0)
        {
            outman.push(i);
            note[i]=1;
        }
    }
    //继续剔除
    int x;
    while(!outman.empty())
    {
        x=outman.front();
        outman.pop();
        record[input[x]]--;
        if(record[input[x]]==0)
        {
            note[input[x]]=1;
            outman.push(input[x]);
        }
    }
    //接下来找最小环
    int sum,point;
    for(int i=1; i<=n; i++)
    {
        if(note[i]==0&&record[i]!=0)
        {
            sum=1;
            point=input[i];
            note[i]=1;
            while(note[point]==0)
            {
                note[point]=1;
                point=input[point];
                sum++;
            }
            if(sum<ans)
            ans=sum;
        }
    }
    cout<<ans;
    return 0;
}

明天再更,现在睡觉(滑稽)

上一篇下一篇

猜你喜欢

热点阅读