• poj1236/luogu2746 Network of Schools (tarjan)


    tarjan缩点后,第一问答案显然是入度为零的点得个数
    第二问:考虑到 没有入度或出度为0的点 的图强连通,
    所以答案就是max{入度为零的个数,出度为零的个数}
    (把出度为零的连到入度为零的点,然后剩下为零的随便连一连就可以)

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define LL long long int
     5 using namespace std;
     6 const int maxn=110,maxm=10010;
     7 
     8 LL rd(){
     9     LL x=0;char c=getchar();int neg=1;
    10     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
    11     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    12     return x*neg;
    13 }
    14 
    15 int N;
    16 int eg[maxm][2],egh[maxn],ect,bel[maxn];
    17 int dfn[maxn],low[maxn],stk[maxn],tot,pct,sct;
    18 int tin,tout;
    19 bool instk[maxn],in[maxn],out[maxn];
    20 
    21 void tarjan(int x){
    22     dfn[x]=low[x]=++tot;stk[++sct]=x;instk[x]=1;
    23     for(int i=egh[x];i!=-1;i=eg[i][1]){
    24         int j=eg[i][0];
    25         if(instk[j]) low[x]=min(low[x],dfn[j]);
    26         else if(!dfn[j]){
    27             tarjan(j);low[x]=min(low[x],low[j]);
    28         }
    29     }
    30     if(dfn[x]==low[x]){
    31         pct++;
    32         while(sct){
    33             instk[stk[sct]]=0;
    34             bel[stk[sct]]=pct;
    35             if(stk[sct--]==x) break;
    36         }
    37     }
    38 }
    39 
    40 inline void adeg(int a,int b){
    41     eg[ect][0]=b;eg[ect][1]=egh[a];egh[a]=ect++;
    42 }
    43 
    44 int main(){
    45     int i,j,k;
    46     N=rd();memset(egh,-1,sizeof(egh));
    47     for(i=1;i<=N;i++){
    48         while(j=rd()) adeg(i,j);
    49     }
    50     for(i=1;i<=N;i++){
    51         if(!dfn[i]) tarjan(i);
    52     }
    53     for(i=1;i<=N;i++){
    54         for(j=egh[i];j!=-1;j=eg[j][1]){
    55             k=eg[j][0];
    56             int ii=bel[i],kk=bel[k];
    57             if(ii!=kk){
    58                 in[kk]=1;out[ii]=1;
    59             }
    60         }
    61     }for(i=1;i<=pct;i++){
    62         if(!in[i]) tin++;
    63         if(!out[i]) tout++;
    64     }
    65     if(pct>1)printf("%d
    %d",tin,max(tin,tout));
    66     else printf("1
    0");
    67     
    68 }
  • 相关阅读:
    Jboss部署war以及获取Resource的真实路径
    命令行获取docker远程仓库镜像列表
    Hibernate5 与 Spring Boot2 最佳性能实践
    Spring Bean的一生
    Spring中统一相同版本的api请求路径的一些思考
    Java并发工具类CountDownLatch源码中的例子
    (转载)23种设计模式的uml图表示及通俗介绍
    GeoHash核心原理解析
    如何保证服务器的安全?
    小强升职记
  • 原文地址:https://www.cnblogs.com/Ressed/p/9409551.html
Copyright © 2020-2023  润新知