• 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=1;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]=1; for(i=head1[x];i;i=e1[i].per) if(f[e1[i].v]==0) Dfs1(e1[i].v); s.push(x); } void Dfs2(int x) { ans[cnt][0]++; ans[cnt][ans[cnt][0]]=x; f[x]=1; int i; for(i=head2[x];i;i=e2[i].per) if(f[e2[i].v]==0) Dfs2(e2[i].v); } void Kosa() { int i; for(i=1;i<=n;i++) if(f[i]==0) Dfs1(i); memset(f,0,sizeof(f)); while(!s.empty()) { int tmp=s.top(); s.pop(); if(f[tmp]==0) { cnt++; Dfs2(tmp); } } } void Printf()//丑陋的处理.... { int i,j,jian=0,tot=0,tmp[maxn],size; for(i=1;i<=cnt;i++) if(ans[i][0]==1)jian++;//只有一个节点的 -- cout<<cnt-jian<<endl; for(i=1;i<=cnt;i++) { int flag=0; if(ans[i][0]==1)continue;//只有一个节点的 pass memset(f,0,sizeof(f)); for(j=1;j<=ans[i][0];j++)f[ans[i][j]]=1; for(j=1;j<=ans[i][0];j++) { int k; for(k=head1[ans[i][j]];k;k=e1[k].per) if(f[e1[k].v]==0) flag=1; } if(!flag) { tot++; tmp[maxn]={0},size=0; for(j=1;j<=ans[i][0];j++)//记下答案 并排序 tmp[++size]=ans[i][j]; sort(tmp+1,tmp+1+size); } } if(tot!=1)cout<<-1; else { for(j=1;j<=size;j++) cout<<tmp[j]<<" "; } } int main() { Input(); Kosa(); Printf(); }
  • 相关阅读:
    htb系列-Web Challenges-Console
    htb系列-Web Challenges-FreeLancer
    离散数学1复习要点
    样本均值和总体均值的区别
    chapter7.参数估计
    计算机系统基础复习指北
    C语言学生信息管理系统
    数学的意义
    计算机系统基础第一章
    C语言文件读写的操作
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5408406.html
Copyright © 2020-2023  润新知