代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int n, m;
int D;
int b;
int e[N], ne[N], h[N], idx = 1;
int in[N]; // 入度
int out[N]; // 出度
int q[N];
int arr[N];
ll u[N]; // 分子
ll v[N]; // 分母
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
ll gcd(ll x, ll y)
{
if (y == 0)
{
return x;
}
else
{
return gcd(y, x % y);
}
}
void fenshu(int l, ll x, ll y)
{
if (u[l] == 0 && v[l] == 0)
{
u[l] = x;
v[l] = y;
}
else
{
u[l] = u[l] * y + x * v[l];
v[l] = v[l] * y;
}
ll o;
if (u[l] > v[l])
o = gcd(u[l], v[l]);
else
o = gcd(v[l], u[l]);
u[l] = u[l] / o;
v[l] = v[l] / o;
}
void topsort()
{
for (int i = 1; i <= m; i++)
{
q[i] = i;
u[i] = 1, v[i] = 1;
}
int hh = 0, tt = m;
while (hh < tt)
{
hh++;
int t = q[hh];
int last = t;
ll r, s;
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (out[last] != 0)
{
r = u[last];
s = v[last] * out[last];
}
fenshu(j, r, s);
in[j]--;
if (in[j] == 0)
{
tt++;
q[tt] = j;
}
}
}
}
int main()
{
memset(h, -1, sizeof(h));
memset(v, 1, sizeof(v));
int w = 1;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> D;
out[i] = D;
if (D == 0)
{
arr[w] = i;
w++;
continue;
}
for (int j = 1; j <= D; j++)
{
cin >> b;
add(i, b);
in[b]++;
}
}
topsort();
for (int i = 1; i <= w - 1; i++)
{
cout << u[arr[i]] << " " << v[arr[i]] << endl;
}
return 0;
}
经测定,后面的样例都爆了
希望能知道修改方法,感谢大佬