TLE,样例不过求助,悬关!!!
查看原帖
TLE,样例不过求助,悬关!!!
742221
Happy_Doggie楼主2024/5/2 21:36

用的是 DinicDinic 算法,哪位 dalaodalao 帮忙看一下

#include <bits/stdc++.h>
using namespace std;
const int inf = 1 << 29,N = 50010,M = 300010;
int head[N], ver[M], edge[M], Next[M], d[N], now[N];
int n, m, s, t, tot, maxflow;
long long z;
queue<int> q;
void add(int x,int y,int z)
{
    ver[++tot] = y, edge[tot] = z, Next[tot] = head[x], head[x] = tot;
    ver[++tot] = x, edge[tot] = 0, Next[tot] = head[y], head[y] = tot;
}
bool bfs()
{
    memset(d, 0, sizeof(d));
    while(!q.empty()) q.pop();
    q.push(s); d[s] = 1; now[s] = head[s];
    while(q.size())
    {
        int x = q.front(); q.pop();
        for(int i = head[x]; i; i = Next[i])
        {
            if(edge[i] && !d[ver[i]])
            {
                q.push(ver[i]);
                now[ver[i]] = d[x] + 1;
                if(ver[i] == t) return 1;
            }
        }
    }
    return 0;
}
int dinic(int x, int flow)
{
    if(x == n) return flow;
    int rest = flow, k;
    for(int i = now[x]; i && rest; i = Next[i])
    {
        now[x] = i;
        if(edge[i] && d[ver[i]] == d[x] + 1)
        {
            k = dinic(ver[i],min(rest,edge[i]));
            if(!k) d[ver[i]] = 0;
            edge[i] -= k;
            edge[i ^ 1] += k;
            rest -= k;
        }
    }
    return flow - rest;
}
int main()
{
    // freopen("T.in","r",stdin);
    scanf("%d %d %lld", &n, &m, &z);
    s = 1,t = n;
    tot = 1;
    for(int i = 1; i <= m; i++)
    {
        int x,y,z; scanf("%d %d %d", &x, &y, &z);
        add(x,y,z);
        add(y,x,0);
    }
    int flow = 0;
    while(bfs()) 
        while(flow = dinic(s,inf)) maxflow += flow;
    if(maxflow == 0) puts("Orz Ni Jinan Saint Cow!");
	else printf("%d %d\n", maxflow, z / maxflow + (z % maxflow != 0));
    return 0;
}
2024/5/2 21:36
加载中...