30分求助
查看原帖
30分求助
1045022
sunjincheng2007楼主2023/10/29 11:44

题目:排水系统

代码:

#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;
}

经测定,后面的样例都爆了

希望能知道修改方法,感谢大佬

2023/10/29 11:44
加载中...