hdu:最大点权(强连通分量kosaraju)
Problem Description
给定一个有向图,每个点ii有点权a_iai,请对于每个点ii,找到ii能到达的点中点权的最大值(包括ii点)。
Input
第一行包含一个正整数T(1\leq T\leq 10)T(1≤T≤10),表示测试数据的组数。
每组数据第一行包含两个正整数n,m(1\leq n\leq 100000,1\leq m\leq 200000)n,m(1≤n≤100000,1≤m≤200000),表示点数和边数。
第二行包含nn个正整,依次表示每个点的点权。
接下来m行,每行包含两个正整数u_i,v_i(1\leq u_i,v_i\leq n,u_i\neq v_i),表示一条u_i\rightarrow v_i的单向边。
Output
对于每组数据输出n行,每行一个整数,第$i$行的数表示$i$点能到达的点中点权的最大值。
输入样例
1
6 6
3 7 5 3 8 5
1 2
2 3
3 1
4 5
5 6
2 6
输出样例
7
7
7
8
8
5
kosaraju算法的应用,在最外面的循环统计强连通分量的个数,在内层dfs统计点的个数
edge不用清空,head需要清空,f需要清空
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=2e5+10;
int head[M],chead[M];
int vis[N],f[N],q[N];
typedef long long ll;
struct _edge
{
int to,next;
}edge[M];
_edge cedge[M];
int cnt=0,ccnt=0,t=0,sum=0;
void add_edge(int from,int to)
{
edge[++cnt].to=to;
edge[cnt].next=head[from];
head[from]=cnt;
}
void cadd_edge(int from,int to)
{
cedge[++ccnt].to=to;
cedge[ccnt].next=chead[from];
chead[from]=ccnt;
}
void dfs(int x)
{
vis[x]=1;
for(int i=head[x];~i;i=edge[i].next)
{
int j=edge[i].to;
if(!vis[j])
dfs(j);
}
q[++t]=x;
}
void dfs2(int x,int y)
{
vis[x]=0;
f[sum]++;
for(int i=chead[x];~i;i=cedge[i].next)
{
int j=cedge[i].to;
if(vis[j]) dfs2(j,y);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T;cin>>T;
while(T--)
{
int n,m,x,y;
cin>>n>>m;
cnt=0,ccnt=0,t=0;
memset(f,0,sizeof(f));
memset(vis,0,sizeof(vis));
memset(head,-1,sizeof(head));
memset(chead,-1,sizeof(chead));
for(int i=0;i<m;++i)
{
cin>>x>>y;
add_edge(x,y);
cadd_edge(y,x);
}
for(int i=1;i<=n;++i)
{
if(!vis[i])
dfs(i);
}
sum=0;
for(int i=n;i>=1;--i)
{
//cout<<q[i]<<'\n';
if(vis[q[i]])
{sum++;dfs2(q[i],q[i]);
}
}
ll ans=0;
for(int i=1;i<=sum;++i)
{
ans+=(f[i]*(ll)(f[i]-1)/2);//除以2不能放在(f[i]-1)前面会向下取整
//cout<<f[i]<<'\n';
}
cout<<ans<<'\n';
}
return 0;
}
hdu:最大点权(强连通分量kosaraju)的更多相关文章
- HDU 3639 Hawk-and-Chicken(强连通分量+缩点)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013480600/article/details/32140501 HDU 3639 Hawk-a ...
- 强连通分量-----Kosaraju
芝士: 有向图强连通分量在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connect ...
- hdu 4685(匹配+强连通分量)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4685 思路:想了好久,终于想明白了,懒得写了,直接copy大牛的思路了,写的非常好! 做法是先求一次最 ...
- POJ 2186 Popular Cows(强连通分量Kosaraju)
http://poj.org/problem?id=2186 题意: 一个有向图,求出点的个数(任意点可达). 思路: Kosaraju算法的第一次dfs是后序遍历,而第二次遍历时遍历它的反向图,从标 ...
- 有向图的强连通分量——kosaraju算法
一.前人种树 博客:Kosaraju算法解析: 求解图的强连通分量
- 模板 - 图论 - 强连通分量 - Kosaraju算法
这个算法是自己实现的Kosaraju算法,附带一个缩点,其实缩点这个跟Kosaraju算法没有什么关系,应该其他的强连通分量算法计算出每个点所属的强连通分量之后也可以这样缩点. 算法复杂度: Kosa ...
- 模板 - 强连通分量 - Kosaraju
Kosaraju算法 O(n+m) vector<int> s; void dfs1(int u) { vis[u] = true; for (int v : g[u]) if (!vis ...
- 图的强连通分量-Kosaraju算法
输入一个有向图,计算每个节点所在强连通分量的编号,输出强连通分量的个数 #include<iostream> #include<cstring> #include<vec ...
- 强连通分量Kosaraju
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #i ...
- 有向图强连通分量的Tarjan算法和Kosaraju算法
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
随机推荐
- easyui datagrid 表头与数据错位
方法一:容易,实用的方法 在jquery.easyui.min.js中查找到field.replace(/[\.|\s]/g, "-")在其后添加replace 例子:field. ...
- jabc连接数据库
Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法.JD ...
- nop调试-区域路由问题
1.在修改nop代码时,web项目里有一个namecontroller,然后区域Areas里也有一个namecontroller, 然后跳转时报错,提示有多个匹配项. 2.查看区域添加路由步骤:两步即 ...
- vue iframe网页内嵌及传参
思路 通过域名传参做并加密处理 内嵌页面通过域名来接收参数并解密 外套页面 <iframe :src="url" scrolling="yes" back ...
- git将自己分支上忽略已修改但不需要的提交的文件
一:在idea上把需要提交的文件勾选上提交 二:git stash命令将余下被修改的文件存入(隐藏)暂存区 git stash 三:切换master分支合并上述分支 四:合并后再返回上述分支,git ...
- 增、改生产订单组件BAPI BAPI_ALM_ORDER_MAINTAIN
转载留存 IT_METHODS LIKE BAPI_ALM_ORDER_METHOD处理方法,必选项,存储CREATE CREATETONOTIF CHANGE DELETE RELEAS ...
- 【C++复习】第七章 类的继承(基类、派生类、虚基类)
1.基类与派生类 类的继承:面向对象的程序设计中提供了类的继承机制,允许程序员在保持原有类特性的基础上,进行更具体.更详细的定义 用途:代码的重用性(继承)和可扩充性(派生) 例:植物大战僵尸游戏中, ...
- [NepCTF2022]中学数学
中学数学 p.q挣扎很久没分解出来,wp出来了赶紧复现试试. 题目 from gmpy2 import * from Crypto.Util.number import * from secret i ...
- /etc/login.defs 创建用户的默认设置文件
/etc/login.defs 文件用于在创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等.需要注意的是,该文件的用户默认配置 ...
- php 虚拟化 linux 入侵检测交作业 不要太nice
#inclide<iostream> using namespace std; int main() { cout<<"暂时自闭一会er"; }