Hawk-and-Chicken 强连通
2024-08-29 14:21:31
题意:一群人投票 票具有传递性 求出累计和最大的数和 哪几个人最大
强连通好题!!!
毫无疑问先强连通缩点
一开始打算拓扑排序求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 ; }
最新文章
- ACM: FZU 2110 Star - 数学几何 - 水题
- linux常用命令(二)
- git的理解
- php执行root命令
- Ubuntu远程连接windows
- 轻松了解Spring中的控制反转和依赖注入(二)
- WPF Step By Step 控件介绍
- 基于核方法的模糊C均值聚类
- 基于Hbase数据的Mapreduce程序环境开发
- Android中UI线程与后台线程交互设计的5种方法
- 解读sample2
- mybaits使用存储过程
- Effective JavaScript :第一章
- Dynamics CRM 通过Odata创建及更新记录各类型字段的赋值方式
- multi lstm attention 坑一个
- Tomcat 在 Linux 上的安装和配置
- Linux 技巧:让进程在后台可靠运行的几种方法(转)
- BZOJ3328: PYXFIB
- NETSDK1061错误解决
- 【Java】java.lang.NullPointerException的两个原因
热门文章
- Linux评估 CPU使用情况
- MySQL insert插入
- SpringBoot JPA 中无法注入 JpaRepository 接口的问题及解决方案
- POJ 3624 Charm Bracelet(01背包模板)
- Python中try...except...else的用法
- linux 学习 端口占用 &;&; 内存使用
- PowerDesigner的Additional Checkes 中使用统配符
- LAMP 3.3 mysql常用操作-1
- Tiny4412 Uboot
- mysql:mysql Access denied for user root@