题意:一群人投票  票具有传递性  求出累计和最大的数和 哪几个人最大

强连通好题!!!

毫无疑问先强连通缩点

一开始打算拓扑排序求dis  但是发现拓扑排序会有重复累加的情况

那么就反向建图   当出点为0时  进行dfs搜索cnt

#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s)
#define ll long long
#define pb push_back
#define CLR(A,v) memset(A,v,sizeof A)
//////////////////////////////////
#define inf 0x3f3f3f3f
const int N=+;
int head[N*],pos;
vector<int> mp[N];
struct Edge
{
int to,nex;
}edge[N*];
void add(int a,int b)
{
edge[++pos].nex=head[a];
head[a]=pos;
edge[pos].to=b;
}
int ind,tot,cnt,dfn[N],low[N],vis[N],belong[N],Stack[N],num[N],in[N],dis[N],out[N];
void init()
{
ind=tot=pos=cnt=;
CLR(Stack,);
CLR(out,);
CLR(dis,);
CLR(in,);
CLR(num,);
CLR(dfn,);
CLR(low,);
CLR(vis,);
CLR(head,);
}
void tarjan(int x)
{
dfn[x]=low[x]=++tot;
Stack[++ind]=x;
vis[x]=;
for(int i=head[x];i;i=edge[i].nex)
{
int v=edge[i].to;
if(!dfn[v])
{
tarjan(v);
low[x]=min(low[x],low[v]);
}
else if(vis[v])
low[x]=min(low[x],low[v]); }
if(low[x]==dfn[x])
{
cnt++;int v;
do
{
v=Stack[ind--];
vis[v]=;
num[cnt]++;
belong[v]=cnt;
}
while(v!=x);
}
}
int Cnt;
void dfs(int x)
{
Cnt+=num[x];
if(mp[x].size())
rep(i,,mp[x].size()-)
{
int v=mp[x][i];
if(vis[v])continue;
vis[v]=;
dfs(v);
}
} int main()
{
int cas;
RI(cas);
int T=;
while(cas--)
{
init();
int n,m;
RII(n,m);
rep(i,,m)
{
int a,b;
RII(a,b);
a++;b++;
add(a,b);
} rep(i,,n)
if(!dfn[i])tarjan(i); rep(i,,n)
{
int u=belong[i];
for(int j=head[i];j;j=edge[j].nex)
{
int v=belong[ edge[j].to ]; if(u!=v)
in[v]++,mp[v].pb(u),out[u]++;
}
}
int maxx=; rep(i,,cnt)
if(out[i]==)
{
Cnt=;
CLR(vis,);
dfs(i);
dis[i]=Cnt; if(Cnt>maxx)
{
maxx=Cnt;
}
}
rep(i,,cnt)
maxx=max(maxx,dis[i]); printf("Case %d: %d\n",++T,maxx-);
int first=;
rep(i,,n)
{
int u=belong[i];
if(dis[u]==maxx)
{
if(first)
first=,printf("%d",i-);
else printf(" %d",i-);
}
}
cout<<endl;
rep(i,,cnt)
mp[i].clear();
}
return ; }

最新文章

  1. ACM: FZU 2110 Star - 数学几何 - 水题
  2. linux常用命令(二)
  3. git的理解
  4. php执行root命令
  5. Ubuntu远程连接windows
  6. 轻松了解Spring中的控制反转和依赖注入(二)
  7. WPF Step By Step 控件介绍
  8. 基于核方法的模糊C均值聚类
  9. 基于Hbase数据的Mapreduce程序环境开发
  10. Android中UI线程与后台线程交互设计的5种方法
  11. 解读sample2
  12. mybaits使用存储过程
  13. Effective JavaScript :第一章
  14. Dynamics CRM 通过Odata创建及更新记录各类型字段的赋值方式
  15. multi lstm attention 坑一个
  16. Tomcat 在 Linux 上的安装和配置
  17. Linux 技巧:让进程在后台可靠运行的几种方法(转)
  18. BZOJ3328: PYXFIB
  19. NETSDK1061错误解决
  20. 【Java】java.lang.NullPointerException的两个原因

热门文章

  1. Linux评估 CPU使用情况
  2. MySQL insert插入
  3. SpringBoot JPA 中无法注入 JpaRepository 接口的问题及解决方案
  4. POJ 3624 Charm Bracelet(01背包模板)
  5. Python中try...except...else的用法
  6. linux 学习 端口占用 &amp;&amp; 内存使用
  7. PowerDesigner的Additional Checkes 中使用统配符
  8. LAMP 3.3 mysql常用操作-1
  9. Tiny4412 Uboot
  10. mysql:mysql Access denied for user root@