首页 > 编程语言 >Codeforces Round #840 (Div. 2) E. Node Pairs-图论、小dp

Codeforces Round #840 (Div. 2) E. Node Pairs-图论、小dp

时间:2023-02-05 19:22:50浏览次数:58  
标签:Node Pairs 个点 840 连通 binom dp 分量

题目链接:https://codeforces.com/problemset/problem/1763/E

题意有点绕,大概就是给一个p,现在希望找到一个n个点的有向图G,恰好有p个点对\(1\leq u<v\leq n\)使得\(u\to v\)是互相可达的,问n最小是多少,然后在最小的情况下问“unidirectional”的点对最大是多少,两个点u,v是unidirectional的定义是存在\(u\to v\)的路径,但是不存在\(v\to u\)的路径。

\

首先对于互相可达这个东西能想到用强连通分量去构造,因为n个点最多就只有\(\binom{n}{2}\)个互相可达的点对,强连通分量刚好能取满,所以第一个问题直接给出dp:\(f(p)=\min_{i=1}^p \{f(p-\binom{i}{2})+i\}\)。

\

下一个问题是unidirectional最大,首先\(\binom{f(p)}{2}-p\)肯定是一个上界,同时肯定是能取到上界,因为我们只要把上文说到的若干个强连通分量排成一排,从左到右连起来,互相可达的点对依然是\(p\)对,而剩下的点对都是单连通的

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define endl '\n'
#define fastio ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef long long ll;
using namespace std;
const int N=2e5+5;
int p,f[N];
ll C2(ll x){return x*(x-1)/2;}
int main(){
	fastio;
	cin>>p;
	f[0]=0;
	rep(i,1,p){
		f[i]=0x3f3f3f3f;
		for(int j=1;C2(j)<=i;j++)
			f[i]=min(f[i],f[i-C2(j)]+j);
	}
	cout<<f[p]<<' '<<C2(f[p])-p;
	return 0;
}

标签:Node,Pairs,个点,840,连通,binom,dp,分量
From: https://www.cnblogs.com/yoshinow2001/p/17093817.html

相关文章