【BZOJ4484】【JSOI2015】最小表示

24人阅读 评论(0) 收藏 举报
分类:

【题目链接】

【思路要点】

  • 单独考虑每个点的出边,这些问题是相互独立的。
  • 对原图拓扑排序,按照拓扑序解决问题。
  • 将每个点的出边按照所到达的点的拓扑序从大到小排序。
  • 若一条出边到达的点还不能由当前点到达,保留这条边,并更新当前点可达的节点集合,否则删除这条边。
  • 该过程显然可以用bitset优化。
  • 时间复杂度\(O(\frac{N*M}{w}+MLogM)\),其中\(w=64\)。

【代码】

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 30005;
template <typename T> void chkmax(T &x, T y) {x = max(x, y); }
template <typename T> void chkmin(T &x, T y) {x = min(x, y); } 
template <typename T> void read(T &x) {
	x = 0; int f = 1;
	char c = getchar();
	for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
	x *= f;
}
template <typename T> void write(T x) {
	if (x < 0) x = -x, putchar('-');
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
}
template <typename T> void writeln(T x) {
	write(x);
	puts("");
}
int n, m, dfn[MAXN];
int d[MAXN], q[MAXN];
vector <int> a[MAXN], b[MAXN];
bitset <MAXN> res[MAXN];
bool cmp(int x, int y) {return dfn[x] > dfn[y]; }
int main() {
	read(n), read(m);
	for (int i = 1; i <= m; i++) {
		int x, y;
		read(x), read(y);
		a[x].push_back(y);
		b[y].push_back(x);
		d[x]++;
	}
	int l = 1, r = 0;
	for (int i = 1; i <= n; i++)
		if (d[i] == 0) q[++r] = i;
	while (l <= r) {
		int tmp = q[l++];
		for (unsigned i = 0; i < b[tmp].size(); i++)
			if (--d[b[tmp][i]] == 0) q[++r] = b[tmp][i];
	}
	for (int i = 1; i <= n; i++) {
		res[i].reset();
		res[i].set(i);
		dfn[q[i]] = i;
	}
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		int tmp = q[i];
		sort(a[tmp].begin(), a[tmp].end(), cmp);
		for (unsigned j = 0; j < a[tmp].size(); j++) {
			int dest = a[tmp][j];
			if (!res[tmp][dest]) {
				cnt++;
				res[tmp] |= res[dest];
			}
		}
	}
	printf("%d\n", m - cnt);
	return 0;
}

查看评论

BZOJ 4484 [Jsoi2015] 最小表示

拓扑排序+bitset+思路
  • SenyeLicone
  • SenyeLicone
  • 2017-05-30 20:11:10
  • 388

【JSOI2015】bzoj4484 最小表示

拓扑排序+bitset
  • sdfzyhx
  • sdfzyhx
  • 2017-05-30 16:41:22
  • 641

【bzoj4484】【JSOI2015】【最小表示】【拓扑排序+bitset】

Description 【故事背景】 还记得去年JYY所研究的强连通分量的问题吗?去年的题目里,JYY研究了对于有向图的“加边”问题。对于图论有着强烈兴趣的JYY,今年又琢磨起了“删边”的问题...
  • sunshinezff
  • sunshinezff
  • 2016-05-21 10:45:16
  • 931

bzoj 4484: [Jsoi2015]最小表示

拓扑+bitset
  • qq_36808030
  • qq_36808030
  • 2017-10-07 15:17:26
  • 155

bzoj 4484 [Jsoi2015]最小表示

拓扑排序+bitset
  • chai_jing
  • chai_jing
  • 2017-05-30 22:36:21
  • 127

bzoj4484[Jsoi2015]最小表示 拓补排序+bitset

挺显然的吧,一条边没有影响当且仅当这个边相连的两个点已经可以互相到达,就是没想到用bitset维护,老纠结map。。。 #include #include #include #include #inc...
  • qq_35866453
  • qq_35866453
  • 2017-07-28 10:02:17
  • 88

【BZOJ4484】【JSOI2015】最小表示(拓扑排序,bitset)

Description 对于一个N个点(每个点从1到N编号),M条边的有向图,JYY发现,如果从图中删去一些边,那么原图的连通性会发生改变;而也有一些边,删去之后图的连通性并不会发生改变。 JYY...
  • hhaannyyii
  • hhaannyyii
  • 2018-04-04 22:49:44
  • 8

4484: [Jsoi2015]最小表示

讲一句废话。边x->y能被删掉当且仅当x能走过其他路到y。 先进行拓扑排序,然后按拓扑序的逆序加点,这样可以保证每次加进去的点都没有入度。 记当前枚到的点为x。然后对x能到的所有点按到出度为0的点的最...
  • wamach
  • wamach
  • 2017-07-27 14:47:21
  • 79

4484: [Jsoi2015]最小表示 bitset+拓扑序

bitset
  • baidu_36797646
  • baidu_36797646
  • 2017-10-07 16:48:50
  • 75

BZOJ 4484: [Jsoi2015]最小表示 拓扑排序 bitset

4484: [Jsoi2015]最小表示 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 120  Solved: 78 [Submit][St...
  • BlackJack_
  • BlackJack_
  • 2017-06-14 09:26:57
  • 172
    个人资料
    持之以恒
    等级:
    访问量: 9835
    积分: 2703
    排名: 1万+
    文章分类
    文章存档