91分#4WA求助
查看原帖
91分#4WA求助
690561
违规用户名690561楼主2023/7/25 16:59

蒟蒻用的是dp做法: 91分版本(k在内层)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
//#pragma G++ optimize(2)
//#pragma G++ optimize(3, "Ofast", "inline")
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, k, s, t, s1, s2, s3, dis[105][10005], tt, in = 0x7fffffff;
bool vis[10005];
struct Y {
	int v, w;
};
struct node {
	int dis, u;
	bool operator>(const node& a) const {
		return dis > a.dis;
	}
};
vector<Y> v[10005];
priority_queue<node, vector<node>, greater<node> > q;
void Dijkstra() {
	for(int i = 0; i < n; i++) {
		for(int j = 0;j <= k;j++){
			dis[j][i] = inf;
		}
	}
	dis[0][s] = 0;
	q.push({0, s});
	while(!q.empty()) {
		tt = q.top().u;
		q.pop();
		if(!vis[tt]) {
			vis[tt] = true;
			for(auto i : v[tt]) {
				for(int j = 0; j <= k; j++) {
					//-----------------------------
					if(dis[j][i.v] > dis[j][tt] + i.w) {
						dis[j][i.v] = dis[j][tt] + i.w;
						q.push({dis[j][i.v], i.v});
					}
					//-----------------------------
					if(j != 0 && dis[j][i.v] > dis[j - 1][tt]) {
						dis[j][i.v] = dis[j - 1][tt];
						q.push({dis[j][i.v], i.v});
					}
					//-----------------------------
				}
			}
		}
	}
}
int main() {
	scanf("%d %d %d", &n, &m, &k);
	scanf("%d %d", &s, &t);
	for(int i = 1; i <= m; i++) {
		scanf("%d %d %d", &s1, &s2, &s3);
		v[s1].push_back({s2, s3});
		v[s2].push_back({s1, s3});
	}
	Dijkstra();
	for(int i = 0;i <= k;i++){
		in = min(in, dis[i][t]);
	}
	printf("%d", in);
	return 0;
}

36分做法(k在dijkstra外层):

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
//#pragma G++ optimize(2)
//#pragma G++ optimize(3, "Ofast", "inline")
using namespace std;
const int inf = 0x3f3f3f3f;
int n, m, k, s, t, s1, s2, s3, dis[105][10005], tt, in = 0x7fffffff, num1, num2, num3;
bool vis[10005];
struct Y {
	int v, w;
};
struct node {
	int dis, u;
	bool operator>(const node& a) const {
		return dis > a.dis;
	}
};
vector<Y> v[10005];
priority_queue<node, vector<node>, greater<node> > q;
void dijkstra(int x) {
	for(int i = 0; i < n; i++) {
		dis[x][i] = inf;
	}
	dis[x][s] = 0;
	q.push({0, s});
	while(!q.empty()) {
		tt = q.top().u;
		q.pop();
		if(!vis[tt]) {
			vis[tt] = true;
			for(auto i : v[tt]) {
				///*
				//-----------------------------
				if(dis[x][i.v] > dis[x][tt] + i.w) {
					dis[x][i.v] = dis[x][tt] + i.w;
					q.push({dis[x][i.v], i.v});
				}
				//-----------------------------
				if(x != 0 && dis[x][i.v] > dis[x - 1][tt]) {
					dis[x][i.v] = dis[x - 1][tt];
					q.push({dis[x][i.v], i.v});
				}
				//*/
				//-----------------------------
				/*
				num1 = dis[x][i.v];
				num2 = dis[x][tt] + i.w;
				if(x != 0) {
					num3 = dis[x - 1][tt];
					if(num1 > num2 && num2 <= num3) {
						dis[x][i.v] = dis[x][tt] + i.w;
						q.push({dis[x][i.v], i.v});
					} else if(num1 > num3 && num2 > num3) {
						dis[x][i.v] = dis[x - 1][tt];
						q.push({dis[x][i.v], i.v});
					}
				} else {
					if(dis[x][i.v] > dis[x][tt] + i.w) {
						dis[x][i.v] = dis[x][tt] + i.w;
						q.push({dis[x][i.v], i.v});
					}
				}
				//*/
			}
		}
	}
}
int main() {
	scanf("%d %d %d", &n, &m, &k);
	scanf("%d %d", &s, &t);
	for(int i = 1; i <= m; i++) {
		scanf("%d %d %d", &s1, &s2, &s3);
		v[s1].push_back({s2, s3});
		v[s2].push_back({s1, s3});
	}
	for(int i = 0; i <= k; i++) {
		dijkstra(i);
	}
	for(int i = 0; i <= k; i++) {
		in = min(in, dis[i][t]);
	}
	printf("%d", in);
	return 0;
}
2023/7/25 16:59
加载中...