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; }