社区讨论

小疑问

灌水区参与者 2已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@m1nnjznd
此快照首次捕获于
2024/09/29 22:04
去年
此快照最后确认于
2024/09/30 12:13
去年
查看原帖
为什么 gg 数组用 memsetmemset 过不了P1850
有什么不一样吗 错误记录 AC记录
CPP
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N = 2010;
const int M = 310;
int c[N], d[N];
double k[N];
double g[N][N];
double dp[N][N][2];
int n, m, v, e;
void floyd () {
	for (int k = 1; k <= v; k ++ ) {
		for (int i = 1; i <= v; i ++ ) {
//			if (i == k || g[i][k] == 1e9) continue;
			for (int j = 1; j < i; j ++ ) {
				g[i][j] = g[j][i] = min (g[i][j], g[i][k] + g[k][j]);
			}
		}
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n >> m >> v >> e; 
	for (int i = 1; i <= n; i ++ ) cin >> c[i];
	for (int i = 1; i <= n; i ++ ) cin >> d[i];
	for (int i = 1; i <= n; i ++ ) cin >> k[i];
// 	memset(g, 0x3f, sizeof(g)); 这个
	for (int i = 1; i <= v; i ++ ) {
		for (int j = 1; j < i; j ++ ) {
			g[i][j] = g[j][i] = 1e9;
		}      
	} // 这个
	     
	for (int i = 1; i <= e; i ++ ) {
		int a, b;
		double w;
		cin >> a >> b >> w;
		g[a][b] = g[b][a] = min (g[a][b], w);
	}
	floyd();
	for (int i = 1; i <= n; i ++ ) {
		for (int j = 0; j <= m; j ++ ) {
			dp[i][j][0] = dp[i][j][1] = 1e9;
		}
	}
	dp[1][0][0] = dp[1][1][1] = 0;
	for (int i = 2; i <= n; i ++ ) {
		for (int j = 0; j <= min (m, i); j ++ ) {
			dp[i][j][0] = min(dp[i - 1][j][0] + g[c[i - 1]][c[i]], dp[i - 1][j][1] + 
			g[d[i - 1]][c[i]] * k[i - 1] + g[c[i - 1]][c[i]] * (1 - k[i - 1]));
          	if (j != 0) {
          		dp[i][j][1] = min(dp[i - 1][j - 1][0] + g[c[i - 1]][d[i]] * k[i] + 
				  g[c[i - 1]][c[i]] * (1 - k[i]),
				  dp[i - 1][j - 1][1] + g[c[i - 1]][c[i]] * (1 - k[i - 1]) * (1 - k[i]) + 
				  g[c[i - 1]][d[i]] * (1 - k[i - 1]) * k[i] + g[d[i - 1]][c[i]] * (1 - k[i]) * 
				  k[i - 1] + g[d[i - 1]][d[i]] * k[i - 1] * k[i]);
			}
          
		}
	}
	double ans = 1e9;
	for (int i = 0; i <= m; i ++ ) {
		ans = min(ans, min(dp[n][i][1], dp[n][i][0]));;
//		cout << dp[n][i][0] << " " << dp[n][i][1] << "\n";
	}
	printf ("%.2lf\n", ans);
}

回复

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

正在加载回复...