社区讨论
奇怪的没有过(求救)
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 条回复,欢迎继续交流。
正在加载回复...