• [poj] 1236 networks of schools


    原题

    这是一道强连通分量板子题。
    显然subtask1 是要输出入度为0的点的个数
    而subtask2,我们考虑一下最优一定是把一个出度为零的点连到入度为零的点上,这样我们要输出的就是max(出度为零的个数,入度为零的个数)
    另外,如果只有一个强连通分量,那么subtask2答案是0

    #include<cstdio>
    #include<algorithm>
    #include<stack>
    #define N 10010
    #define M 50010
    using namespace std;
    int n,m,head[N],dfn[N],low[N],cnt=1,t,sum,bel[N],out[N],num[N],in[N],ans,as;
    bool instk[N];
    stack <int> stk;
    struct hhh
    {
        int to,next;
    }edge[M];
    
    int read()
    {
        int ans=0,fu=1;
        char j=getchar();
        for (;(j<'0' || j>'9') && j!='-';j=getchar()) ;
        if (j=='-') fu=-1,j=getchar();
        for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
        return ans*fu;
    }
    
    void add(int u,int v)
    {
        edge[cnt].to=v;
        edge[cnt].next=head[u];
        head[u]=cnt++;
    }
    
    void Tarjan(int x)
    {
        dfn[x]=low[x]=++t;
        stk.push(x);
        instk[x]=1;
        int v;
        for (int i=head[x];i;i=edge[i].next)
        {
    	v=edge[i].to;
    	if (!dfn[v])
    	{
    	    Tarjan(v);
    	    low[x]=min(low[x],low[v]);
    	}
    	else if (instk[v]) low[x]=min(low[x],dfn[v]);
        }
        if (dfn[x]==low[x])
        {
    	sum++;
    	do
    	{
    	    v=stk.top();
    	    stk.pop();
    	    instk[v]=0;
    	    bel[v]=sum;
    	    num[sum]++;
    	}while(v!=x);
        }
    }
    
    int main()
    {
        n=read();
        for (int i=1,a;i<=n;i++)
        {
    	a=read();
            while(a!=0)
    	{
    	    add(i,a);
    	    a=read();
    	}
        }
        for (int i=1;i<=n;i++)
    	if (!dfn[i]) Tarjan(i);
        for (int i=1;i<=n;i++)
    	for (int j=head[i],v;j;j=edge[j].next)
    	{
    	    v=edge[j].to;
    	    if (bel[i]!=bel[v]) in[bel[v]]++,out[bel[i]]++;
    	}
        for (int i=1;i<=sum;i++)
        {
    	if (!in[i]) ans++;
    	if (!out[i]) as++;
        }
        printf("%d
    ",ans);
        if (sum==1) printf("0
    ");
        else printf("%d",max(ans,as));
        return 0;
    }
    
    
  • 相关阅读:
    为什么少有人在Windows电脑上安OS X?
    Xamarin.iOS开发初体验
    MySQL MyISAM/InnoDB高并发优化经验
    windows系统上安装与使用Android NDK r8d(二)
    windows系统上安装与使用Android NDK r8d(一)
    Windows平台下如何使用Android NDK
    Xamarin 手动安装步骤+破解(最新版Xamarin V3)
    MONO,原来你是水中月
    剑客vs刀客 Java vs .NET
    终于理解了什么是LGPL
  • 原文地址:https://www.cnblogs.com/mrha/p/7840742.html
Copyright © 2020-2023  润新知