poj1236 Network of Schools

//264K 32MS

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<stack>
using namespace std;
stack<int>S;
struct node
{
    int id;
    node *next;
}head[110];
int n;
int ranse;
int index;
int color[110];//每个节点的颜色
bool visit[110];
bool instack[110];
int dfn[110];
int low[110];
int colorrudu[110];//每种颜色的入度
int colorchudu[110];//每种颜色的出度
void init()
{
    int i;
    for(i=1;i<=n;i++)
    {
        instack[i]=false;
        visit[i]=false;
        colorrudu[i]=0;
        colorchudu[i]=0;
    }
}
void dfs(int u)
{
    S.push(u);
    instack[u]=true;
    visit[u]=true;
    dfn[u]=low[u]=++index;
    node *p;
    p=head[u].next;
    while(p!=NULL)
    {
        if(!visit[p->id])
        {
            dfs(p->id);
            low[u]=low[u]<low[p->id]?low[u]:low[p->id];
        }
        else if(instack[p->id])
        {
            low[u]=low[u]<low[p->id]?low[u]:low[p->id];
        }
        p=p->next;
    }
    int v;
    if(dfn[u]==low[u])
    {
        ranse++;
        while(1)
        {
            v=S.top();S.pop();
            color[v]=ranse;
            instack[v]=false;
            if(v==u)
            {
                break;
            }
        }
    }
}
void caldu()
{
    node *p;
    int i;
    int ourcolor;
    for(i=1;i<=n;i++)
    {
        ourcolor=color[head[i].id];
        p=head[i].next;
        while(p!=NULL)
        {
            if(color[p->id]!=ourcolor)
            {
                colorchudu[ourcolor]++;
                colorrudu[color[p->id]]++;
            }
            p=p->next;
        }
    }
}
int main()
{
    scanf("%d",&n);
    int i;
    node *temp;
    for(i=1;i<=n;i++)
    {
        head[i].id=i;
        int b;
        while(scanf("%d",&b),b)
        {
            temp=head[i].next;
            head[i].next=new node;
            head[i].next->id=b;
            head[i].next->next=temp;
        }
    }
    //输入完毕
    init();
    index=0;
    ranse=0;
    for(i=1;i<=n;i++)
    {
        if(!visit[i])
        {
            dfs(i);
        }
    }
    //染色完毕,一种颜色为一个强连通分量
    caldu();//计算每种 颜色的入度和出度
    if(ranse==1)
    {
        printf("1\n0\n");
        return 0;
    }
    int res1=0,res2=0;
    for(i=1;i<=ranse;i++)
    {
        if(colorrudu[i]==0)
        {
            res1++;
        }
        if(colorchudu[i]==0)
        {
            res2++;
        }
    }
    printf("%d\n",res1);
    printf("%d\n",res1>res2?res1:res2);
    return 0;
}

 



posted @ 2012-07-26 22:21  willzhang  阅读(116)  评论(0编辑  收藏  举报