社区讨论

奇怪的没有过(求救)

P4819[中山市选] 杀人游戏参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m5yoo66u
此快照首次捕获于
2025/01/16 10:00
去年
此快照最后确认于
2025/11/04 11:32
4 个月前
查看原帖
CPP
#include <cctype>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <bitset>
#include <complex>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <map>
#include <new>
#include <queue>
#include <set>
#include <stack>
#include <vector>

#if __cplusplus >= 201103L
#include <chrono>
#include <random>
#include <thread>
#include <tuple>
#endif

#define ll long long
#define Ull unsigned long long
#define sll static long long
#define db double
#define sint static int
#define lint inline int
#define lb inline bool
#define lll inline long long
#define For(i, bg, ed,add) for (int i = bg; i <= ed; i += add)
#define whileTrue while (true)
#define elif else if
#define max1(a, b) (a > b) ? a : b
#define min1(a, b) (a < b) ? a : b

using namespace std;
inline int read() {
	int x = 0, f = 1;
	char ch;
	while (ch < '0' || ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return x * f;
}

int n, m, value[300100];
int dfn[300100], low[300100], idx;
int isIn[300100], num[300100], sum[300100];
stack<int> _stk;
vector<int> G[300100], G1[300100];
int rd[300100], cnt;
db ans = 0;
int mint[300100];
int Tarjan(int x) {
	dfn[x] = low[x] = ++idx;
	_stk.push(x);
	isIn[x] = 1;
	for (auto y : G[x]) {
		if (dfn[y] == 0) {
			Tarjan(y);
			low[x] = min1(low[y], low[x]);
		} else
			if(isIn[y])
				low[x] = min1(low[x], dfn[y]);
	}
	if (dfn[x] == low[x]) {
		cnt++;
		int tmp = 0;
		while (tmp != x){
			tmp = _stk.top();
			_stk.pop();
			num[tmp] = cnt;
			sum[cnt]++;
			isIn[tmp] = 0;
		}
	}
}
bool check(int x) {
	for (auto y : G1[x])
		if (rd[y] < 2) return false;
	return true;
}
int main() {
    int *p = &n, *q = &m;
	scanf("%d%d", p, q);
	if (n == 1) {
		printf("1.000000");
		return 0;
	}
	for (int i = 1; i <= m; i++) {
		int u, v;
	    scanf("%d%d", &u, &v);
		G[u].push_back(v);
	}
	for (int i = 1; i <= n; i++) {
		if (!dfn[i])
			Tarjan(i);
	}
	for (int i = 1; i <= n; i++) {
		for (auto j : G[i]) {
			if (num[i] != num[j]) {
				rd[num[j]]++;
				G1[num[i]].push_back(num[j]);
			}
		}
	}
	int flag = 1;
	for (int i = 1; i <= cnt; i++) {
		if(rd[i] == 0) {
			ans++;
			if (sum[i] == 1 and check(i)) {
				flag = 0;
			}
		}
	}
	if (!flag and ans >= 2) ans = ans - 1;
	printf("%.6lf", double((n - ans) / n));
	return 0;
}


测试点

回复

0 条回复,欢迎继续交流。

正在加载回复...