首页 > 其他分享 >洛谷 P3387 【模板】缩点

洛谷 P3387 【模板】缩点

时间:2023-08-10 16:35:06浏览次数:64  
标签:缩点 cnt 洛谷 int P3387 num getchar

在洛谷中查看


所有思考都在代码,可以结合代码思考谢谢~


#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+5;
int n,m,val[N];
int dfn[N], low[N], num, col[N], cnt;
//col 记录每个点属于哪个联通分量 
//num 记录遍历时间    cnt 记录缩点完后有多少个点 
int st[N], top;
queue<int> q;
int new_val[N], du[N], f[N], ans;
vector<int> g[N],new_g[N];
inline int read(){
	int s=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){s=(s<<1)+(s<<3)+(c^48);c=getchar();}
	return s*f;
}
void tarjan(int x){
	dfn[x]=low[x]=++num;st[++top]=x;//更新这个点 
	for(int i=0;i<g[x].size();i++){
		int t=g[x][i];
		if(!dfn[t])tarjan(t),low[x]=min(low[x],low[t]);//往下更新(要确保下个点没被更新) 
		else if(!col[t])low[x]=min(low[x],dfn[t]);//被更新了,但没被划分到强连通分量里 
	}
	if(dfn[x]==low[x])for(cnt++;st[top+1]!=x;top--)col[st[top]]=cnt,new_val[cnt]+=val[st[top]];//找到这个连通分量的代表,划分 
	/*
	为什么要有low?
		因为我们最后要划分强连通分量(上面的操作),但不知道什么时候划分,所以添一个low。
		当dfn==low时就统计,这样不重不漏。 
	*/
}
void topsort(){
	for(int i=1;i<=cnt;i++)if(!du[i])q.push(i),f[i]=new_val[i],ans=max(ans,new_val[i]);
	while(!q.empty()){
		int h=q.front();
		q.pop();
		for(int i=0;i<new_g[h].size();i++){
			int t=new_g[h][i];
			f[t]=max(f[t],f[h]+new_val[t]);//缩点后无环,能直接统计 
			ans=max(ans,f[t]);
			if(!--du[t])q.push(t);
		}
	}
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++)val[i]=read();
	for(int i=1;i<=m;i++){
		int u=read(),v=read();
		g[u].push_back(v);
	} 
	for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);//这个点仍不在任一个强连通分量里 
	/*
	目的:把每个点都放进一个强连通分量里,这样缩点完后就不存在环,就可以拓扑排序了 
	所以流程就是:
	1.缩点,使整个图无环,方便后面拓扑排序  复杂度:O(n+m) 
	2.拓扑排序找最大路径 复杂度:O(m)
	*/
	for(int i=1;i<=n;i++)cout<<i<<' '<<col[i]<<endl;
	for(int i=1;i<=n;i++){
		for(int j=0;j<g[i].size();j++){
			int t=g[i][j];
			if(col[i]!=col[t])new_g[col[i]].push_back(col[t]),du[col[t]]++;//记录新图的边 
		}
	} 
	topsort();
	cout<<ans;
	return 0;
}

标签:缩点,cnt,洛谷,int,P3387,num,getchar
From: https://www.cnblogs.com/JT-dw/p/17620719.html

相关文章

  • 洛谷 CF572B题解
    思路首先,将SELL和BUY交易数据分别存放在两个桶。接下来,从小到大遍历。取出最小的\(s\)个:从大到小遍历,取出最大的\(s\)个。分别存放在queue和stack中,如果不到\(s\)就取完为止。最后,输出queue和stack中的所有元素即可。代码实现:#include<bits/stdc++.h>usi......
  • 洛谷 P1336 最佳课题选择 题解
    P1336最佳课题选择题解状态:考虑\(f_{i,j}\)表示前\(i\)种论文里面,一共写了\(j\)篇,的最少花费时间。转移策略:我们一次考虑每一种论文写多少篇。假设写\(k\)篇,\(k\in[0,j]\cap\mathbb{Z}\),有转移方程:\[f_{i,j}=min(f_{i-1,j-k}+cost(i,k)),k\in[0,j]\cap\mathbb{......
  • 洛谷 P6010 - [USACO20JAN] Falling Portals P
    先考虑怎么对一组询问求解答案。容易想到一种贪心策略:如果\(a_{q_i}<a_i\),那么我们肯定希望自己能够尽量快地下落,因此如果遇到一个下落速度大于当前世界下落速度的传送门我们肯定就会进那个世界,如此走下去知道能够传送到世界\(q_i\)为止。对于\(a_{q_i}>a_i\)的情况也类似,只......
  • 洛谷 P8500 - [NOI2022] 冒泡排序
    显然将权值离散化是没有问题的,因为必然存在一组最优解,满足每个\(a_i\)都取自于某个\(V_i\),于是不管三七二十一先将\(V_i\)离散化了再说。考虑从部分分入手逐步分析这道题:特殊性质A:\(V_i=1\)相当于这个区间中的数必须是\(1\),先将这些数去掉不管,紧接着考虑\(V_i=0\)的......
  • 【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I
    【LGR-148-Div.3】洛谷基础赛#1&MGOIRoundIT1luoguP9502『MGOI』SimpleRoundI|A.魔法数字\(100pts\)水题,场切了。#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#definesortstable_sort#defineendl'\n'intmain(){ ......
  • 【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I
    【LGR-148-Div.3】洛谷基础赛#1&MGOIRoundI据说是普及组难度?T1P9502『MGOI』SimpleRoundI|A.魔法数字\(100pts\)题目描述初级魔法士小M的魔法数字是\(2\)。给定一个正整数\(n\),小M需要找到最大的偶数\(m\),使得\(2^m<n\)。又双叒叕是个水题,然后被又双......
  • 【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I
    T1简单题,题面十分清晰,就是给我们\(n\),要求使\(2^m<n\)成立的最小偶数\(m\)。(要注意\(log_2N=m,m|2\)的情况)#include<bits/stdc++.h>#definelllonglong#definereregisterusingnamespacestd;constintN=800,INF=0x3f3f3f3f;lln;intmain(){ cin>>n; llk=log......
  • Tarjan缩点
    P3225[HNOI2012]矿场搭建一共只会删除一个点,将每个点双连通分量分三种情况讨论第一种:点双连通分量没有割点,那么为了保证一定可以逃出去,至少需要两个点第二种:点双连通分量有且只有一个割点,此处割点是绿色的点,那么对于这种点双连通分量就需要在每个只有一个割点的双连通分量......
  • 【反思】洛谷8月月赛 Div.2 & RiOI Round 2 赛后反思
    RiOIR2赛后反思赛时开了一个T1,但是\(0pts\),然后就跑去跟人对线然后复盘(主要是我的锅,我忘记对线怎么开始的了)到了吃饭(雾不过本来我也不会做,不能怪人家赛后是shenshen教我T1+看的若归老师的反思捏推歌:歌爱ユキ&稲葉曇《キミに回帰缐》(希望没打错是我的错吗铅笔......
  • 2023年多校联训NOIP层测试4+洛谷 8 月月赛 I & RiOI Round 2
    2023年多校联训NOIP层测试4爆零了T1幸运数字\(0pts\)T2密码\(0pts\)没做到,咕了。T3小X和他的朋友们\(0pts\)没做到,咕了。T4树上询问\(0pts\)没做到,咕了。【LGR-150-Div.2】洛谷8月月赛I&RiOIRound2T1luoguP9496「RiOI-2」hacker\(100pts\)......