记录编号 250586 评测结果 AAAAA
题目名称 通讯问题 最终得分 100
用户昵称 GravatarMarvolo 是否通过 通过
代码语言 C++ 运行时间 0.002 s
提交时间 2016-04-15 13:14:29 内存使用 0.79 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

int n,i,a,b,zs,dp,d,j,k,g,zd,ss;
int l[110][1000];
int s[2000];
int t[110][110];
int low[110],dfn[110],f[110],v[110],bj[110];

int min(int a,int b){return (a<b)?a:b;}

void work(int p){
	zs++;
	t[zs][0]++;
	t[zs][t[zs][0]]=p;
	while (s[dp]!=p) {
		t[zs][0]++;
		t[zs][t[zs][0]]=s[dp];
		f[s[dp]]=0;
		dp--;
	}
	f[s[dp]]=0;
	dp--;
	return;
}

void tarjan(int x){
	int i;
	d++;
	low[x]=dfn[x]=d;
	dp++;
	s[dp]=x;
	f[x]=1;
	if (l[x][0]!=0) 
	 for (i=1;i<=l[x][0];i++) 
	  if (v[l[x][i]]==0) {
	  	v[l[x][i]]=1;
	  	tarjan(l[x][i]);
	  	low[x]=min(low[x],low[l[x][i]]);
	  } else if (f[l[x][i]]==1) low[x]=min(low[x],dfn[l[x][i]]);
	  if (low[x]==dfn[x]) 
	  work(x);
	return;
}

int main(){
	freopen("jdltt.in","r",stdin);
	freopen("jdltt.out","w",stdout);
	scanf("%d",&n);
	while (~scanf("%d%d",&a,&b)) {
		if (a==b) continue;
		l[a][0]++;
		l[a][l[a][0]]=b;
	}
	
	for (i=1;i<=n;i++)
	{
		if (v[i]==0) {
			v[i]=1;
			tarjan(i);
		}
	}
	printf("%d\n",zs);
	for (i=1;i<=zs;i++)
	{
	for (j=1;j<=t[i][0]-1;j++)
		for (k=j+1;k<=t[i][0];k++)
		if (t[i][j]>t[i][k]) 
	    {
	    	ss=t[i][k];
	    	t[i][k]=t[i][j];
	    	t[i][j]=ss;
		}
		}
	
	for (i=1;i<=zs;i++)
	{
		k=0;	zd=0x7fffffff;
		for (j=1;j<=zs;j++)
		if (zd>t[j][1]) {
			zd=t[j][1]; k=j;
		}
		for (j=1;j<=zs;j++)
		if (k==j) {
			for (g=1;g<=t[j][0];g++)
			printf("%d ",t[j][g]);
			printf("\n");
			t[j][1]=0x7fffffff;
			break;
		}
		}
	return 0;
}