codevs 2822爱在心中

不想吐槽题目....

/*
K bulabula 算法(好像用哪个T bulabula更简单 然而我并不会 - -)
丑陋的处理cnt:
Printf时 cnt中 ans[i][0]==1 的删掉
然后更丑陋的处理强连通分量的出度 :
先把所包含的所有点f 成1 然后以每个点为起点跑一边 看看是不是出度指向本连通分量内的点
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<algorithm>
#define maxn 1010
using namespace std;
stack<int>s;
int out[maxn];
int ans[maxn][maxn],n,m,f[maxn],cnt,vis[maxn][maxn];
int head1[maxn],head2[maxn],num;
struct node
{
int u,v,per;
}e1[maxn],e2[maxn];
void Input()
{
cin>>n>>m;
int i,a,b;
for(i=;i<=m;i++)
{
cin>>a>>b;
num++;
e1[num].u=a;
e1[num].v=b;
e1[num].per=head1[a];
head1[a]=num;
e2[num].u=b;
e2[num].v=a;
e2[num].per=head2[b];
head2[b]=num;
}
}
void Dfs1(int x)
{
int i;
f[x]=;
for(i=head1[x];i;i=e1[i].per)
if(f[e1[i].v]==)
Dfs1(e1[i].v);
s.push(x);
}
void Dfs2(int x)
{
ans[cnt][]++;
ans[cnt][ans[cnt][]]=x;
f[x]=;
int i;
for(i=head2[x];i;i=e2[i].per)
if(f[e2[i].v]==)
Dfs2(e2[i].v);
}
void Kosa()
{
int i;
for(i=;i<=n;i++)
if(f[i]==)
Dfs1(i);
memset(f,,sizeof(f));
while(!s.empty())
{
int tmp=s.top();
s.pop();
if(f[tmp]==)
{
cnt++;
Dfs2(tmp);
}
}
}
void Printf()//丑陋的处理....
{
int i,j,jian=,tot=,tmp[maxn],size;
for(i=;i<=cnt;i++)
if(ans[i][]==)jian++;//只有一个节点的 --
cout<<cnt-jian<<endl;
for(i=;i<=cnt;i++)
{
int flag=;
if(ans[i][]==)continue;//只有一个节点的 pass
memset(f,,sizeof(f));
for(j=;j<=ans[i][];j++)f[ans[i][j]]=;
for(j=;j<=ans[i][];j++)
{
int k;
for(k=head1[ans[i][j]];k;k=e1[k].per)
if(f[e1[k].v]==)
flag=;
}
if(!flag)
{
tot++;
tmp[maxn]={},size=;
for(j=;j<=ans[i][];j++)//记下答案 并排序
tmp[++size]=ans[i][j];
sort(tmp+,tmp++size);
}
}
if(tot!=)cout<<-;
else
{
for(j=;j<=size;j++)
cout<<tmp[j]<<" ";
}
}
int main()
{
Input();
Kosa();
Printf();
}
上一篇:23个Python爬虫开源项目代码,包含微信、淘宝、豆瓣、知乎、微博等


下一篇:Spring的AOP-----HelloWord