zoukankan      html  css  js  c++  java
  • 【NOIP2015提高组Day1】信息传递 TJ

    Sample Input

    5
    2 4 2 3 1
    

    Sample Output  

    3
    

    TJ:

    将输入数据画成一个有向图,于是答案就是这个图的最小强连通分量(一个点不算)的大小。

    这个应该不难理解吧~~~

    上图!!!!

    所以,这题就变成了一个类似“Tarjan”的东东。

    温馨提示:每个点只有一条出边,所以不要像我一开始一样傻傻地打一个“前向星”。

    ~~~~~~~~~~~上代码!

    #include<bits/stdc++.h>
    #define fo(i,a,b) for(int i=a;i<=b;i++)
    #define min(a,b) (a<b?a:b)
    using namespace std;
    int n,m,x,y,ans,S,tot;
    bool bz[200010],bz1[200010];
    int a[200010],t[200010];
    void dg(int x){
    	if(bz1[t[x]]){
    		if(bz[t[x]])ans=min(a[x]-a[t[x]]+1,ans);
    		bz[x]=0;
    		return;
    	}
    	bz[t[x]]=bz1[t[x]]=1;
    	a[t[x]]=a[x]+1;
    	dg(t[x]);
    	bz[x]=0;
    }
    int main(){
    	freopen("message.in","r",stdin);
    	freopen("message.out","w",stdout);
    	scanf("%d",&n);
    	fo(i,1,n){
    		scanf("%d",&t[i]);
    	}
    	ans=2147483647;
    	fo(i,1,n){
    		if(bz1[i])continue;
    		bz1[i]=1;
    		bz[i]=1;
    		a[i]=1;
    		dg(i);
    	}
    	printf("%d
    ",ans);
    	
    	return 0;
    }
    

      

    我的Tarjan是手推的,感觉上差不多,与正常Tarjan的细微差距请无视

  • 相关阅读:
    OCP-1Z0-053-V12.02-541题
    OCP-1Z0-053-V12.02-544题
    OCP-1Z0-053-V12.02-545题
    OCP-1Z0-053-V13.02-711题
    OCP-1Z0-053-V12.02-493题
    OCP-1Z0-053-V13.02-696题
    OCP-1Z0-053-V12.02-522题
    OCP-1Z0-053-V12.02-523题
    OCP-1Z0-053-V12.02-534题
    OCP-1Z0-053-V13.02-692题
  • 原文地址:https://www.cnblogs.com/Kelvin2005/p/10895982.html
Copyright © 2011-2022 走看看