POJ 1236 Tarjan缩点及思维..

原创 2011年10月18日 12:48:10

  题意是有N个学校...每个学校可能向几个学校进行数据传输(单向的)...问..至少需要把一个文件给几个学校可以使给的N个学校都收到文件...再问在加几个通信线路可以使各个学校之间都能直接或间接的传递文件...

   一个强连通分量里的点肯定能互相传输...所以先用Tarjan缩点....如果一个点没有入度...那么则说明其他所有点无论如何都到不了这个点..如果要将文件传给所有点..那么首先没有入度的点必须要直接发文件...再想除了这些点..那么其他的点肯定有入度了...那么当把所有没有入度的点给选了之后..其他有入度的点必然能到达..所以第一问就是没有入度.点的个数..但要注意.如果都有入度..那么也是需要1个点的..因为至少要把文件给发下去吧..

   第二问....所有点都能互相到达...那么没有出度的点肯定要加出度边...没有入度的点肯定要加入度边...如果入度和出度点正好相等那么就两两配对加~~加的边正好就是没有入度或者说没有出度点的个数...如果没有出度边大于没有入度边..那么先两两配对..然后多的出度点再和一般的点来做边..那加的边正好是出度点的个数...反之如果没有入度的点多于没有出度的点..那么加的边数就是没有入度点的个数...所以第二问的答案就是没有入度的点和没有出度的点的最大值...

   一个要特别注意的..就是用Tarjan缩点后只剩一个点的情况..要特判输出 1  0


Program:

#include<iostream>
#include<math.h>
#include<stack>
#define MAXN 110
using namespace std;
struct p1
{
    int x,y,next;       
}line[MAXN*MAXN];
int n,k,m,i,A,B,link[MAXN],p,low[MAXN],dfn[MAXN],tp[MAXN],tpn;
bool init[MAXN],outit[MAXN],instack[MAXN];
stack<int> mystack;
void tarjan(int h)
{
     int k;
     instack[h]=true;
     dfn[h]=low[h]=++p;
     mystack.push(h);
     k=link[h];
     while (k)
     {
         if (!dfn[line[k].y])
         {
             tarjan(line[k].y);        
             low[h]=min(low[h],low[line[k].y]);
         }else
         if (instack[line[k].y])
         {
             low[h]=min(low[h],dfn[line[k].y]);                   
         }
         k=line[k].next;  
     }
     k=h;
     if (low[k]==dfn[k])
     {
          tpn++;              
          do
          {
              k=mystack.top();
              mystack.pop();
              tp[k]=tpn;             
          }         
          while (low[k]!=dfn[k]);                   
     }
     return;
}
void getanswer()
{
     int i;
     while (!mystack.empty()) mystack.pop(); 
     memset(dfn,0,sizeof(dfn));
     tpn=p=0;
     for (i=1;i<=n;i++)
     if (!dfn[i])
     {
          memset(instack,false,sizeof(instack));
          tarjan(i);           
     }
     memset(link,0,sizeof(link));     
     memset(init,false,sizeof(init));
     memset(outit,false,sizeof(outit));
     p=0;
     for (i=1;i<=m;i++)
     if (tp[line[i].x]!=tp[line[i].y])
     {
           p++;    
           line[p].x=tp[line[i].x];  line[p].y=tp[line[i].y];
           line[p].next=link[line[p].x];   
           link[line[p].x]=p;       
           outit[line[p].x]=true; init[line[p].y]=true;             
     }
     n=tpn;  m=p;
     //---------------------------------------------
     A=0;  B=0;
     for (i=1;i<=n;i++) 
     {
           if (!init[i]) A++;
           if (!outit[i]) B++;
     }
     B=A>B?A:B;         
     if (!A) A=1;     
     if (n==1) B=0;
     //---------------------------------------------
}
int main()
{ 
    while (~scanf("%d",&n))
    { 
         m=0;   
         memset(link,0,sizeof(link));
         for (i=1;i<=n;i++)
         while (~scanf("%d",&k))
         {
              if (!k) break; 
              m++;
              line[m].x=i; line[m].y=k;              
              line[m].next=link[i];  link[i]=m; 
         }  
         getanswer();
         printf("%d\n%d\n",A,B);
    } 
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kk303/article/details/6884061

poj1236 - Network of Schools

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                              ...
  • wangjian8006
  • wangjian8006
  • 2012-08-20 23:56:12
  • 4021

POJ1236 强连通分量

题目链接:http://poj.org/problem?id=1236 题目大意: N(2 大概算法: 我们可以先进行缩点求出dag图,然后我们考虑第一个问题,求最少发几套软件可以全覆...
  • qq_35772697
  • qq_35772697
  • 2017-01-01 14:40:30
  • 400

POJ 1236(tarjan 强连通分量 缩点)

POJ1236题目大意问,对于一个DAG(又向无环图): 1.至少要选几个点,才能从这些点出发到达所有点 2.至少加入几条边,就能从图中任何一个点出发到达所有点分析先求DAG的强连通分量数,再缩点...
  • mmy1996
  • mmy1996
  • 2017-02-22 22:11:31
  • 688

poj1236-Network of Schools

Network of Schools Time Limit:1000MS    Memory Limit:10000KB    64bit IO Format:%I64d & %I64u ...
  • lljjccsskk
  • lljjccsskk
  • 2015-08-18 10:56:50
  • 294

【poj 1236】Network of Schools 【IOI 1996】

Description A number of schools are connected to a computer network. Agreements have been developed...
  • TLECOCE
  • TLECOCE
  • 2017-09-11 22:38:31
  • 133

POJ1236

Problem: Network of Schools Description: 有N个学校,每个学校之间单向可以发送软件,现在给你一些学校之间的收发关系。问你下面两个问题:至少要给多少个学校发送软...
  • FlushHip
  • FlushHip
  • 2016-05-12 08:41:27
  • 351

POJ 1236 Network of Schools(tarjan缩点)

Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1938...
  • Mr_Treeeee
  • Mr_Treeeee
  • 2017-08-25 16:04:57
  • 132

POJ1236 Network of Schools【Tarjan】【强连通分量】

题目大意: N台电脑之间能够通过有向边(u,v)从第u台电脑传输文件到第v台电脑。如果给第u台电脑投放 一个文件,那么这个文件就能通过有向边传输到第v台电脑上,给你N台电脑的连接情况。 那么问题来了:...
  • u011676797
  • u011676797
  • 2015-02-03 10:21:26
  • 1031

POJ 1236 Network of Schools (强连通分量tarjan)

题意: 简单来说,给出一张有向图,问至少选择几个点可以遍历全图 和 至少加几条边使任一个点出发都可以遍历全图 分析: 这是一个与强联通分量有关的问题,在强联通分量中任意一个点都可以到达其他点,那么...
  • Forever_wjs
  • Forever_wjs
  • 2016-07-24 20:31:33
  • 620
收藏助手
不良信息举报
您举报文章:POJ 1236 Tarjan缩点及思维..
举报原因:
原因补充:

(最多只允许输入30个字)