记录编号 295848 评测结果 AAAAA
题目名称 通讯问题 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.024 s
提交时间 2016-08-14 16:56:16 内存使用 0.29 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=110;
struct edge{
	int to,prev;
	edge():prev(0){}
}e[maxn*maxn<<1];
void insert(int,int);
void dfs(int);
int n,x,y,last[maxn]={0},len=0,cnt=0,belong[maxn]={0},tim=0,dfn[maxn],low[maxn];
int a[maxn],top=0;
bool ins[maxn]={false},vis[maxn]={false};
int main(){
#define MINE
#ifdef MINE
	freopen("jdltt.in","r",stdin);
	freopen("jdltt.out","w",stdout);
#endif
	scanf("%d",&n);
	while(scanf("%d%d",&x,&y)==2)insert(x,y);
	for(int i=1;i<=n;i++)if(!belong[i])dfs(i);
	printf("%d\n",cnt);
	for(int i=1;i<=n;i++)if(!vis[i]){
		for(int j=1;j<=n;j++)if(belong[j]==belong[i]){
			printf("%d ",j);
			vis[j]=true;
		}
		printf("\n");
	}
	return 0;
}
void insert(int x,int y){
	e[++len].to=y;
	e[len].prev=last[x];
	last[x]=len;
}
void dfs(int x){
	int y;
	dfn[x]=low[x]=++tim;
	a[++top]=x;
	ins[x]=true;
	for(int i=last[x];i;i=e[i].prev){
		y=e[i].to;
		if(!dfn[y]){
			dfs(y);
			low[x]=min(low[x],low[y]);
		}
		else if(ins[y])low[x]=min(low[x],dfn[y]);
	}
	if(dfn[x]==low[x]){
		cnt++;
		do{
			y=a[top--];
			ins[y]=false;
			belong[y]=cnt;
		}while(x!=y);
	}
}