zoukankan      html  css  js  c++  java
  • [不知道哪来的题] 变量(variable)

    Description

    (n) 个变量 (w[1],w[2],cdots ,w[n]) ,每个变量可以取 (W)(-W)

    (p) 个式子,形如 $$H_i=a_i imes |w[x_i]-w[y_i]|+b_i imes |w[y_i]-w[z_i]|+c_i imes |w[z_i]-w[x_i]|+d_i imes (w[x_i]-w[y_i])+e_i imes (w[y_i]-w[z_i])+f_i imes (w[z_i]-w[x_i])$$

    (q) 个条件,形如 (w[x]le w[y])(w[x]=w[y])(w[x]<w[y])

    最小化 (sum w_i+sum H_i)

    Input

    第一行一个整数 (t) 表示数据组数。
    每组数据第一行四个整数 (n,W,p,q)
    接下来 (p) 行每行九个整数 (x_i,y_i,z_i,a_i,b_i,c_i,d_i,e_i,f_i)
    接下来 (q) 行每行三个整数 (x,y,r)
    (r=0) 表示 (w[x]le w[y])(r=1) 表示 (w[x]=w[y])(r=2) 表示 (w[x]<w[y])
    保证存在方案。

    Limit

    (tle 10)(nle 500)(p,qle 1000)(1le Wle 10^6)(0le a_i,b_i,c_i,d_i,e_i,f_ile 1000)

    Solution

    这题看着吓人而已,不过是套路罢了...

    显然一个变量只有 (1)(-1) 两种取值(最后答案乘一个 (W) )。

    现在将每个变量 (x) 看成点。

    (x) 拆分,成为 (x_1)(x_2) ,表示 (1)(-1) 两种取值。

    • ((S,x_1)) 表示 (x)(1)
    • ((x_2,T)) 表示 (x)(-1)
    • ((x_1,x_2,+infty)) ,表示这条边不能割,即 (x) 不能同时有两个取值。
    • ((x_1,y_2)) ,流量为二倍,表示绝对值之差为 (2)
    • 对于限制关系,分类讨论一些连边,表示这些边不能被割。具体见代码

    最小割即可。对于负流量,可以加上一个常数来解决。

    #include<bits/stdc++.h>
    using namespace std;
    
    template <class T> inline void read(T &x) {
    	x = 0; static char ch = getchar(); for (; ch < '0' || ch > '9'; ch = getchar());
    	for (; ch >= '0' && ch <= '9'; ch = getchar()) (x *= 10) += ch - '0';
    }
    
    #define N 1050
    #define rep(i, a, b) for (int i = a; i <= b; i++)
    #define INF 0x3f3f3f3f
    #define ll long long
    
    int S, T, head[N], cur[N], tot = 1, q[N], dep[N];
    struct edge { int v, c, next; }e[12001];
    inline void insert(int u, int v, int c) { e[++tot].v = v, e[tot].c = c, e[tot].next = head[u]; head[u] = tot; }
    inline void add(int u, int v, int c) { insert(u, v, c), insert(v, u, 0); }
    inline bool bfs() {
    	memset(dep, 0, sizeof dep); dep[S] = 1;
    	int l = 1, r = 1; q[1] = S;
    	while (l <= r) {
    		int u = q[l++];
    		for (int i = head[u], v; i; i = e[i].next) if (e[i].c && !dep[v = e[i].v]) {
    			dep[v] = dep[u] + 1, q[++r] = v;
    			if (!(v ^ T)) return 1;
    		}
    	}
    	return 0;
    }
    int dfs(int u, int dist) {
    	if (u == T) return dist;
    	int ret = 0;
    	for (int &i = head[u], v; i; i = e[i].next) if (dep[v = e[i].v] == dep[u] + 1 && e[i].c) {
    		int d = dfs(v, min(dist - ret, e[i].c));
    		e[i].c -= d, e[i ^ 1].c += d, ret += d;
    		if (ret == dist) return dist;
    	}
    	if (!ret) dep[u] = -1;
    	return ret;
    }
    inline void cpy() { rep(i, S, T) cur[i] = head[i]; }
    inline void rec() { rep(i, S, T) head[i] = cur[i]; }
    int dinic() { int ret = 0; cpy(); while (bfs()) ret += dfs(S, INF), rec(); return ret; }
    
    int n, p, Q, val[N], g[N][N];
    ll W;
    
    int main() {
    	int Case; read(Case);
    	while (Case--) {
    		memset(head, 0, sizeof head); tot = 1;
    		memset(val, 0, sizeof val), memset(g, 0, sizeof g);
    		read(n), read(W), read(p), read(Q);
    		rep(i, 1, n) val[i] = 1;
    		while (p--) {
    			int x, y, z, a, b, c, d, e, f;
    			read(x), read(y), read(z), read(a), read(b), read(c), read(d), read(e), read(f);
    			val[x] += d - f, val[y] += e - d, val[z] += f - e;
    			if (x < y) g[x][y] += a; else g[y][x] += a;
    			if (y < z) g[y][z] += b; else g[z][y] += b;
    			if (z < x) g[z][x] += c; else g[x][z] += c;
    		}
    		int mx = 0; rep(i, 1, n) mx = max(mx, abs(val[i]) + 1);
    		T = (n << 1) + 1;
    		rep(i, 1, n) add(S, i, mx + val[i]), add(i, i + n, INF), add(i + n, T, mx - val[i]);
    		rep(i, 1, n) rep(j, i + 1, n) if (g[i][j]) add(i + n, j, g[i][j] << 1), add(j + n, i, g[i][j] << 1);
    		while (Q--) {
    			int x, y, r; read(x), read(y), read(r);
    			if (!r) add(y + n, x, INF);
    			if (r == 1) add(x + n, y, INF), add(y + n, x, INF);
    			if (r == 2) add(S, x, INF), add(y + n, T, INF);
    		}
    		printf("%lld
    ", (dinic() - mx * n) * W);
    	}
    	return 0;
    }
    
  • 相关阅读:
    thinkphp3.2.3版本在windows本地apache环境运行正常,上传到centos服务器apache环境中出现:thinkphp 上传根目录不存在!请尝试手动创建:uploads/
    [POI2013]LUK-Triumphal arch
    【背包问题】
    2016 acm香港网络赛 A题. A+B Problem (FFT)
    tomcat部署项目的三种方式
    仿照ArrayList自己生成的MyList对象
    使用回调函数实现回文判断
    关于angularjs的model的一些问题
    关于使用Tomcat服务器出现413错误的解决办法(Request Entity Too Large)
    关于angularjs+typeahead的整合
  • 原文地址:https://www.cnblogs.com/aziint/p/9160846.html
Copyright © 2011-2022 走看看