记录编号 |
250586 |
评测结果 |
AAAAA |
题目名称 |
通讯问题 |
最终得分 |
100 |
用户昵称 |
Marvolo |
是否通过 |
通过 |
代码语言 |
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;
}