本文主要是介绍Codeforces Round #469 (Div. 1) C. Data Center Maintenance(Tarjan),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接:http://codeforces.com/contest/949/problem/C
开始看错了题目,根本不会啊?
后来发现保证初始情况下,原图一定是accessible的,然后我们所有的ci和cj,当u[ci]+1=u[cj]时,我们建立一条又ci到cj的有向边,然后我们发现,我们更改一个点的时候,一定要把他所有的后继节点都更改掉,所以我们将原图缩点之后,生成一个拓扑图,每个点的代表一个联通块,点权表示联通块中点数目的大小,然后问题就成了,所有没有后继的节点中,点权最小的是多少。
代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;//点数
const int MAXM=2e5+5;//边数
namespace Tarjan
{struct Edge{int to,nxt;}edge[MAXM];int head[MAXN],tot;int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN];//Belong数组的值是1~sccint Index,top;int scc;//强连通分量的个数bool Instack[MAXN]; int num[MAXN];//各个强连通分量包含点的个数,数组编号1~scc //num数组不一定需要,结合实际情况void addedge(int u,int v){
这篇关于Codeforces Round #469 (Div. 1) C. Data Center Maintenance(Tarjan)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!