求助TLE 75pts,悬赏1关注
查看原帖
求助TLE 75pts,悬赏1关注
347589
Zelotz楼主2023/4/11 15:59
#include <bits/stdc++.h>
using namespace std;
#define srand srand(time(NULL))
#define random(x) rand() % (x)
#define il inline
#define ptc putchar
#define reg register
#define mp make_pair
#define pb push_back
#define R(i, l, r) for (int i = l; i <= r; ++i)
#define debug puts("--------------------------------------------")
typedef long long ll;
typedef pair<int, int> PII;
namespace kunkun
{
    template <typename T>
    il void read(T &x)
    {
    x = 0; T f = 1; char ch;
    while (!isdigit(ch = getchar())) f -= (ch == '-') << 1;
    while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar(); x *= f;
    }
    template <typename T, typename ...L>
    il void read(T &x, L &...y) {read(x); read(y...);}
    template <typename T>
    il void write(T x)
    {
        if (x < 0) ptc('-'), x = -x;
        if (x > 9) write(x / 10);
        ptc(x % 10 + '0');
    }
    template <typename T, typename ...L>
    il void write(T &x, L &...y) {write(x), ptc(' '); write(y...);}
}
using namespace kunkun;
#define int ll
const int N = 5e5 + 5, M = 300;
int n, m, a[M][M], T[M], W[M];
struct Minimum_Cost_Maximum_Flow
{
	int s, t, tot = 1, head[N], dep[N], now[N], flw, cst;
	bool vis[N];
	struct node
	{
	    int u, v, nxt, cost; ll w;
	} E[N];
	void add(int u, int v, int w, int c)
	{
	    E[++tot].u = u, E[tot].v = v, E[tot].w = w, E[tot].cost = c, E[tot].nxt = head[u];
	    head[u] = tot;
	    E[++tot].u = v, E[tot].v = u, E[tot].w = 0, E[tot].cost = -c, E[tot].nxt = head[v];
	    head[v] = tot;
	}
	bool spfa()
	{
		
		queue <int> q;
		R(i, s, t) dep[i] = INT_MAX, now[i] = head[i], vis[i] = 0;
		q.push(s), dep[s] = 0, vis[s] = 1;
		while (q.size())
		{
			int x = q.front(); q.pop();
			vis[x] = 0;
			for (int i = head[x]; i; i = E[i].nxt)
			{
				int v = E[i].v;
				if (E[i].w > 0 && dep[v] > dep[x] + E[i].cost)
				{
					dep[v] = dep[x] + E[i].cost;
					if (!vis[v]) q.push(v), vis[v] = 1;
				}
			}
		}
		if (dep[t] == INT_MAX) return 0;
		return 1;
	}
	int dfs(int x, ll tmp)
	{
	    if (x == t) return tmp;
		vis[x] = 1;
	    for (int i = now[x]; i; i = E[i].nxt)
	    {
	        now[x] = i;
	        int v = E[i].v;
	        if (!vis[v] && E[i].w > 0 && (dep[v] == dep[x] + E[i].cost))
	        {
	            int k = min(E[i].w, tmp);
	            int p = dfs(v, k);
	            if (!p) continue;
	            E[i].w -= p, E[i ^ 1].w += p;
	            cst += E[i].cost * p; return p;
	        }
	    }
	    return 0;
	}
	void dinic() {while (spfa()) while (int x = dfs(s, 1e9)) flw += x;}
} mcmf;
signed main()
{
//	freopen("17.in", "r", stdin);
	read(n, m); mcmf.s = 0, mcmf.t = n + m + 1;
	R(i, 1, m)
	{
		int x; read(x);
		mcmf.add(mcmf.s, i + n, x, 0); // S连物品 
	}
    R(i, 1, n)
    {
        R(j, 1, m)
        {
        	read(a[i][j]);
        	if (a[i][j]) mcmf.add(j + n, i, INT_MAX, 0); // 物品连人
		}
    }
    R(i, 1, n)
    {
    	int x; read(x);
    	R(j, 1, x) read(T[j]);
    	R(j, 1, x + 1) read(W[j]);
    	R(j, 1, x) mcmf.add(i, mcmf.t, T[j] - T[j - 1], W[j]);
    	mcmf.add(i, mcmf.t, INT_MAX, W[x + 1]);
	}
    mcmf.dinic();
    write(mcmf.cst);
    return 0;
}
2023/4/11 15:59
加载中...