为什么这样写会WA几个点
查看原帖
为什么这样写会WA几个点
138356
ZXY99楼主2020/8/18 15:24
#include <bits/stdc++.h>

using namespace std;


typedef long long ll;
typedef unsigned long long ull;

const ll INF = (1ll << 62);

#define DEBUG(x) std::cerr << #x << " = " << x << std::endl

template <typename T> void read (T &x) {
    x = 0; bool f = 1; char ch;
    do {ch = getchar(); if (ch == '-') f = 0;} while (ch > '9' || ch < '0');
    do {x = x * 10 + ch - '0'; ch = getchar();} while (ch >= '0' && ch <= '9');
    x = f ? x : -x;
}

const int N = 100 + 5;
const int K = 1e3 + 5;

#define int ll

int n, m, k, ans, g[N][N], f[N][N][K];

signed main() {
	read(n); read(m); read(k);
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < n; j++) {
			g[i][j] = INF;
			for(int l = 0; l <= k; l++) {
				f[i][j][l] = INF;
				f[i][i][l] = 0;
			}
		}
		g[i][i] = 0;
	}
	for(int i = 1, u, v, w; i <= m; i++) {
		read(u); read(v); read(w);
		u -- ; v -- ;
		g[u][v] = min(g[u][v], w);
	}
	for(int l = 0; l <= k; l++) {
		for(int k = 0; k < n; k++) {
			for(int i = 0; i < n; i++) {
				for(int j = 0; j < n; j++) {
					if(i == j) continue;
					if(g[k][j] == INF) continue;
					if(f[i][k][l] != INF) f[i][j][l] = min(f[i][j][l], f[i][k][l] + g[k][j]);
					if(l >= 1 && f[i][k][l - 1] != INF) f[i][j][l] = min(f[i][j][l], f[i][k][l - 1] - g[k][j]);
				}	
			}
		}
	}
	ans = INF;
	for(int i = 0; i <= k; i++) ans = min(ans, f[0][n - 1][i]);
	cout << ans << endl;
	return 0;
}
2020/8/18 15:24
加载中...