```cpp
#include <bits/stdc++.h>
#define memset0(a) memset(a, 0, sizeof a)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MAXN = 1e5 + 5;
const int MAXM = 1e5 + 5;
int n, m;
vector<int> G[MAXN];
struct Edge {
int x, u, v;
} e[MAXM];
int dfn[MAXN], low[MAXN], bel[MAXN], siz[MAXN], dfn_cnt, scc_cnt;
stack<int> st;
bool ins[MAXN];
void Tarjan(int u) {
dfn[u] = low[u] = ++dfn_cnt;
st.push(u); ins[u] = true;
for (auto v : G[u]) {
if (!dfn[v]) {
Tarjan(v);
low[u] = min(low[u], low[v]);
} else if (ins[v])
low[u] = min(low[u], dfn[v]);
}
if (dfn[u] == low[u]) {
scc_cnt++;
int v; do {
v = st.top(); st.pop(); ins[v] = false;
bel[v] = scc_cnt;
siz[scc_cnt]++;
} while (v != u);
}
}
int deg[MAXN]; // 入度
int f[MAXN]; // 每个缩点后的节点的最少分到的糖数量
int main() { ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i++)
cin >> e[i].x >> e[i].u >> e[i].v;
// 加 0 边
for (int i = 1; i <= m; i++) {
int x = e[i].x, u = e[i].u, v = e[i].v;
if (x == 1) {
G[u].push_back(v);
G[v].push_back(u);
} else if (x == 3) {
G[v].push_back(u);
} else if (x == 5) {
G[u].push_back(v);
}
}
// Tarjan
for (int u = 1; u <= n; u++)
if (!dfn[u])
Tarjan(u);
// 缩点
memset0(G);
n = scc_cnt;
for (int i = 1; i <= m; i++) {
int x = e[i].x, u = e[i].u, v = e[i].v;
u = bel[u], v = bel[v];
if (x == 2 || x == 4) {
if (u == v) {
cout << -1 << '\n';
exit(0);
}
if (x == 2) {
G[u].push_back(v); deg[v]++;
} else if (x == 4) {
G[v].push_back(u); deg[u]++;
}
}
}
// 拓扑排序
for (int u = 1; u <= n; u++)
f[u] = 1;
int tot = 0;
queue<int> q;
for (int u = 1; u <= n; u++)
if (deg[u] == 0)
q.push(u);
while (!q.empty()) {
int u = q.front(); q.pop();
tot++;
for (auto v : G[u]) {
f[v] = max(f[v], f[u]+1);
deg[v]--;
if (deg[v] == 0)
q.push(v);
}
}
if (tot < n) {
cout << -1 << '\n';
exit(0);
}
ll ans = 0;
for (int u = 1; u <= n; u++)
ans += (ll)siz[u] * f[u];
cout << ans << '\n';
return 0;
}
```
by August_Light @ 2023-11-04 17:21:40
@[August_Light](/user/589916) 看了一下 我猜是这样的
这组样例
```
3 2
3 1 2
4 2 3
```
a[1]>=a[2] a[2]>a[3]
应当输出5 但您的程序输出了4
错因大概是拓扑排序后忽略了>=边和<=边
by 羊叫兽同学 @ 2023-11-10 11:02:19
@[羊叫兽同学](/user/476767) 拜谢拜谢拜谢拜谢
by August_Light @ 2023-11-10 12:54:34