您的位置:首页 > 其它

POJ 1236 Network of Schools

2013-03-19 15:19 441 查看
强连通分量

问题一,缩点后,求出所有入度为0的点的个数;

问题二,缩点后,求出入度为0的点的个数和出度为0的点的个数中的最大值

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;
vector<int> g[120];
int tg[120];
int dfn[120];
int low[120];
bool ins[120];
int s[120],ls;
int incnt[120],outcnt[120];
int key;
int tag;
int min(int a,int b)
{
return a>b?b:a;
}
void tarjan(int u)
{
int v,i;
dfn[u]=key;
low[u]=key;
key++;
ins[u]=true;
s[ls]=u;
ls++;
for (i=0; i<g[u].size(); i++)
{
v=g[u][i];
if (dfn[v] == -1)
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if (dfn[v] != -1 && ins[v] == true)
{
low[u]=min(low[u],dfn[v]);
}
}
if (dfn[u] == low[u])
{
do
{
v=s[ls-1];
ls--;
ins[v]=false;
tg[v]=tag;
}while (v != u);
tag++;
}
}
int main()
{
int n,i,j,t1,res1,res2;
scanf("%d",&n);
for (i=1; i<=n; i++)
{
while (1)
{
scanf("%d",&t1);
if (t1 == 0)
break;
g[i].push_back(t1);
}
}
memset(dfn,-1,sizeof(dfn));
memset(ins,false,sizeof(ins));
key=1;
tag=1;
ls=0;
for (i=1; i<=n; i++)
{
if (dfn[i] == -1)
tarjan(i);
}
tag--;
memset(incnt,0,sizeof(incnt));
memset(outcnt,0,sizeof(outcnt));
for (i=1; i<=n; i++)
{
for (j=0; j<g[i].size(); j++)
{
if (tg[i] == tg[g[i][j]])
continue;
incnt[tg[g[i][j]]]++;
outcnt[tg[i]]++;
}
}
res1=0;
res2=0;
for (i=1; i<=tag; i++)
{
//  printf("%d %d\n",incnt[i],outcnt[i]);
if (incnt[i] == 0)
res1++;
if (outcnt[i] == 0)
res2++;
}
printf("%d\n",res1);
if (tag == 1)
{
printf("0\n");
}
else
{
printf("%d\n",res1>res2?res1:res2);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: