社区讨论

玄学 RE 求调

P3116[USACO15JAN] Meeting Time S参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@m2jvw7mc
此快照首次捕获于
2024/10/22 11:26
去年
此快照最后确认于
2024/10/22 15:19
去年
查看原帖
rt。
CPP
#include <bits/stdc++.h>
#define int long long
int max(int x, int y) { return x > y ? x : y; }
int min(int x, int y) { return x < y ? x : y; }

const int N = 1e2 + 16, MW = 5e3 + 16; 
struct node {
	int to, w; 
}; 
std::vector <node> G1[N], G2[N]; 
int in1[N], in2[N], n, m; 

bool dp1[N][MW], dp2[N][MW]; 

signed main() {
	
	std::ios::sync_with_stdio(false), std::cin.tie(nullptr), std::cout.tie(nullptr); 
	
	std::cin >> n >> m;
	int maxlimit1 = 0, maxlimit2 = 0; 
	for (int i = 1; i <= m; ++ i) {
		int u, v, w1, w2; std::cin >> u >> v >> w1 >> w2;
		maxlimit1 += w1, maxlimit2 += w2; 
		G1[u].push_back((node) {v, w1}), ++ in1[v]; 
		G2[u].push_back((node) {v, w2}), ++ in2[v]; 
	}
	
	auto tps1 = [&]() -> void {
//		dp[i][j] --> 第 i 个点,是否能经过长度为 j 的路径到达	
		std::queue <int> q;
		for (int i = 1; i <= n; ++ i) 
			if (!in1[i]) q.push(i), dp1[i][0] = 1; 
		while (!q.empty()) {
			int u = q.front(); q.pop();
			for (int i = 0; i < (long long)G1[u].size(); ++ i) { // u --> v
				int v = G1[u][i].to, w = G1[u][i].w;
				for (int j = w; j <= maxlimit1; ++ j) dp1[v][j] |= dp1[u][j - w]; 
				if (-- in1[v] == 0) q.push(v); 
			}
		}
		return void(); 
	}; 
	
	auto tps2 = [&]() -> void {
		std::queue <int> q;
		for (int i = 1; i <= n; ++ i) 
			if (!in2[i]) q.push(i), dp2[i][0] = 1;
		while (!q.empty()) {
			int u = q.front(); q.pop();
			for (int i = 0; i < (long long)G2[u].size(); ++ i) {
				int v = G2[u][i].to, w = G2[u][i].w;
				for (int j = w; j <= maxlimit2; ++ j) dp2[v][j] |= dp2[u][j - w];
				if (-- in2[v] == 0) q.push(v); 
			}
		}
		return void(); 
	};
	
	tps1(), tps2(); 
	
	int mlt = max(maxlimit1, maxlimit2);
	for (int i = 0; i <= mlt; ++ i) 
		if (dp1[n][i] && dp2[n][i]) {
			return std::cout << i << "\n", 0; 
		}
	std::cout << "IMPOSSIBLE\n"; 
	
	
	return 0; 
}

回复

0 条回复,欢迎继续交流。

正在加载回复...