zoukankan      html  css  js  c++  java
  • 题解 P2661 【信息传递】

    由题意得,只有强连通分量之间传递才能最终得到自己的编号。

    可以用(tarjan)找出强连通分量,并从中找出大于1的最小的强连通分量则是最小的游戏回合数

    //AC代码
    //找SCC 
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cctype>
    #include<stack>
    #define N 200010
    using namespace std;
    int n;
    int Root[N],Next[N],v[N],cnt;
    int scc[N],scccnt,dfn[N],low[N],dfscnt;
    int ans[N];
    stack<int>st;
    inline void add(int _u,int _v)
    {
    	v[++cnt]=_v;
    	Next[cnt]=Root[_u];
    	Root[_u]=cnt;
    }
    inline void tarjan(int u){
        dfn[u]=low[u]=++dfscnt;
        st.push(u);
        for(int x=Root[u];x!=0;x=Next[x]){
            if(!dfn[v[x]]){
    			tarjan(v[x]); 
    			low[u]=min(low[u],low[v[x]]);
    		}
            else if(!scc[v[x]]) low[u]=min(low[u],dfn[v[x]]);
        }
        int t;
        if(low[u]==dfn[u]){
            scccnt++;
            do{
                t=st.top(); st.pop();
                scc[t]=scccnt,ans[scccnt]+=1;
            }while(t!=u);
        }
    }
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i)
    	{
    		int V;scanf("%d",&V);
    		add(i,V);
    	}
    	for(int i=1;i<=n;++i)
    		if(!dfn[i])tarjan(i);
    	int Min=0x3f3f3f3f;
    	for(int i=1;i<=n;++i){
    		if(ans[i]>1)Min=min(Min,ans[i]);
    	}
    	printf("%d",Min);
    	return 0;
    }
    
  • 相关阅读:
    手机各种JS语法,随时更新
    ionic上拉加载-下拉刷新
    JS获取浏览器信息及屏幕分辨率
    jQuery元素的显示、隐藏及动画
    jQuery原型
    表单序列化为对象
    html里的ajax数据传输
    面试技巧-互联网行业通吃
    jquery表单验证validate
    Javascript缓动动画原理
  • 原文地址:https://www.cnblogs.com/Wuhen-GSL/p/15041658.html
Copyright © 2011-2022 走看看