最小环问题之信息传递
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;
}
明天再更,现在睡觉(滑稽)