首页 > 其他分享 >POI2012FES-Festival

POI2012FES-Festival

时间:2024-04-25 09:04:03浏览次数:14  
标签:Festival rep st int low dis top POI2012FES

POI #Year2012 #Tarjan #最短路

强联通分量之间是不影响的,考虑对于一个强联通分量内,方案数等于这个强联通内的最短路\(+1\)

// Author: xiaruize
const int N = 6e2 + 10;

int n, m1, m2;
vector<int> g[N];
int dis[N][N];
bool vis[N];
int dfn[N], top[N], low[N], tot;
stack<int> st;
int res[N];
int id[N], cnt = 0;

void tarjan(int x)
{
	dfn[x] = low[x] = ++tot;
	st.push(x);
	vis[x] = true;
	for (auto v : g[x])
	{
		if (!dfn[v])
		{
			tarjan(v);
			low[x] = min(low[x], low[v]);
		}
		else if (vis[v])
		{
			low[x] = min(low[x], dfn[v]);
		}
	}
	if (dfn[x] == low[x])
	{
		cnt++;
		while (st.top() != x)
		{
			id[st.top()] = cnt;
			vis[st.top()] = false;
			st.pop();
		}
		id[st.top()] = cnt;
		vis[st.top()] = false;
		st.pop();
	}
}

void solve()
{
	mms(dis, 0x3f);
	cin >> n >> m1 >> m2;
	rep(i, 1, m1)
	{
		int u, v;
		cin >> u >> v;
		dis[u][v] = min(dis[u][v], 1);
		dis[v][u] = min(dis[v][u], -1);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	rep(i, 1, m2)
	{
		int u, v;
		cin >> u >> v;
		dis[v][u] = min(dis[v][u], 0);
		g[v].push_back(u);
	}
	rep(i, 1, n)
	{
		dis[i][i] = 0;
		if (!dfn[i])
			tarjan(i);
	}
	rep(k, 1, n)
	{
		rep(i, 1, n)
		{
			if (id[k] != id[i] && dis[i][k] < INF)
				continue;
			rep(j, 1, n)
			{
				dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
			}
		}
	}
	rep(i, 1, n)
	{
		if (dis[i][i] < 0)
		{
			cout << "NIE" << endl;
			return;
		}
		rep(j, 1, n) if (id[i] == id[j])
			res[id[i]] = max(res[id[i]], dis[i][j] + 1);
	}
	int ans = 0;
	rep(i, 1, n) ans += res[i];
	cout << ans << endl;
}

#ifndef ONLINE_JUDGE
bool end_of_memory_use;
#endif

signed main()
{
	// freopen(".in","r",stdin);
	// freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int testcase = 1;
	// cin >> testcase;
	while (testcase--)
		solve();
#ifndef ONLINE_JUDGE
	cerr << "Memory use:" << (&end_of_memory_use - &start_of_memory_use) / 1024.0 / 1024.0 << "MiB" << endl;
	cerr << "Time use:" << (double)clock() / CLOCKS_PER_SEC * 1000.0 << "ms" << endl;
#endif
	return 0;
}

标签:Festival,rep,st,int,low,dis,top,POI2012FES
From: https://www.cnblogs.com/xiaruize/p/18156733

相关文章

  • 初中英语优秀范文100篇-079The Spring Festival I will never forget-我永远忘不了的
    PDF格式公众号回复关键字:SHCZFW079记忆树1ThereisnodoubtthattheSpringFestivalisofgreatimportancetoalltheChinese.翻译毫无疑问,春节对所有的中国人来说都非常重要简化记忆春节句子结构There(形式主语)+is(系动词)+nodoubt(表语),使用了现在时,表示“毫无......
  • AT_codefestival_2016_final_b
    根据题意,很容易得知要使得它们的最大值最小,就要从最小的\(1\)开始用。转化一下题意,不难发现,我们只需求出最小的\(k\),使得\[\\sum_{i=1}^ki\\gen\]于是思路便产生了:对\(1\),\(2\),\(3\),⋯\(k\)求和,直到上述式子成立。可以很容易地看出来一个规律:\[(\\sum_{i=1}^ki\)......
  • AT_code_festival_2018_quala_b题解
    题意给定一个序列,里面的值只有可能是\(a\)或\(b\)(\(a<b\))。有\(m\)个区间,这里面的值必须是\(a\),求如何是序列总和最大。思路因为\(n\)和\(m\)都只有100,所以可以先暴力将所有值设为\(b\),再将区间里的值暴力修改为\(a\),最后统计答案。ACCODE#include<bits/stdc......
  • 题解 AT_codefestival_2016_final_f【Road of the King】
    注意到当前移动到的位置并不重要,重要的是经过的点数和\(1\)所在强连通分量大小,因此把它们放进状态里:设\(f_{i,j,k}\)表示进行\(i\)次移动,经过了\(j\)个不同的点,此时\(1\)所在的强连通分量大小为\(k\)的方案数。考察下一次移动到的点的情况:没有访问过:共有\(n-j\)......
  • AT_codefestival_2016_qualB_c Gr-idian MST
    思路首先想到暴力建边跑最小生成树,但是显然会TLE。所以思考有没有时间复杂度更低的做法,考虑到最小生成树是每次取最短的边,所以我们也可以先考虑较短的边。首先最短的边一定是某一列或者某一行(或者若干列和行),所以我们取边,也应该是一行一行或者一列一列的取。但是有些时候这样......
  • CF1575G GCD Festival 题解
    题意给定一个长度为\(n\)的正整数数列\(a\),求\[\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\gcd\left(a_i,a_j\right)\times\gcd\left(i,j\right)\](\(1\len,a_i\le10^5\))。题解根据欧拉函数的性质,可以得出\[n=\sum\limits_{d\midn}\varphi(d)\]该......
  • CODE FESTIVAL 2017 Final J 题解
    problem&blog。萌萌点分治,积累个trick/qq。对于完全图\((V,E)\),将\(E\)分成\(E_1,E_2,\cdots,E_k\)(\(E_1\cupE_2\cup\cdots\cupE_k=E\))。对每个边集求MST,得到新边集\(E_1^{'},E_2^{'},\cdots,E_k^{'}\),再求MST。最终剩下的边集,等同于原边集的MST。......
  • Codeforces Round 878 (Div. 3) D. Wooden Toy Festival
    题目翻译:给定一个序列,你可以把序列分为任意的三组不要求顺序,对于每一组序列给出一个数字作为标准,求出序列中和该数字的差绝对值的最大值,现在要求你选顶三个数字使得三个序列的差最大值的最大值最小解题思路:二分,要想方差最小,就让每一组的极差都最小,即最大值减最小值最小#include......
  • 题解 CF1840D【Wooden Toy Festival】
    不妨设\(a\)单调递增(无重复),显然如果\(n\le3\)答案就是\(0\)。显然答案\(k\)具有可二分性。也就是说,当\(k<k_0\)时一定不存在合法的\(x,y,z\),当\(k\gek_0\)时一定存在,\(k_0\)就是答案。因此二分答案,只需要验证答案\(k\)是否存在合法的\(x,y,z\)。为了覆盖到......
  • CODE FESTIVAL 2016 qual C
    你说的对,但是我觉得应该先把qualC写完再去学什么东西。CFcodeforces.#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#include<iostream>usingnamespacestd;intn;chars[110];intmain(){scanf("%s",s+1)......