社区讨论

30分求助,A*该如何记录k短路径

P4467[SCOI2007] k短路参与者 4已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lo2tfiw4
此快照首次捕获于
2023/10/23 19:29
2 年前
此快照最后确认于
2024/07/30 13:46
2 年前
查看原帖
CPP
#include <iostream>
#include <queue>
#include <string>
#include <algorithm>
#include <cstring>
#define x first
#define y second
using namespace std;
typedef pair<int,int> pll;
typedef pair<int,pll> plll;
const int N = 60 , M = 2e3 + 510;
int n , m , k , a  , b , h[N] , rh[N] , ne[M] , e[M] , w[M] , idx , dist[N] , cnt[N] , pre[N];
bool st[N];
//第 i 个点的第 j 条最短路径
string road[60][220];

void add(int h[],int a,int b,int c)
{
	e[idx] = b , ne[idx] = h[a] , w[idx] = c , h[a] = idx++;
}

void dijkstra()
{
	memset(dist , 0x3f , sizeof dist);
	priority_queue<pll , vector<pll> , greater<pll>> heap;
	heap.push({0 , b});
	dist[b] = 0;
	
	while(heap.size())
	{
		auto t = heap.top();
		heap.pop();
		
		int ver = t.y;
		if(st[ver]) continue;
		st[ver] = 1;
		
		for(int i = rh[ver] ; ~i ; i = ne[i])
		{
			int j = e[i];
			if(dist[j] > dist[ver] + w[i]){
				dist[j] = dist[ver] + w[i];
				heap.push({dist[j] , j});
			}				
		}		
	}	
}

void astar()
{
	priority_queue<plll , vector<plll> , greater<plll>> heap;
	heap.push({dist[a] , {0 , a}});
	while(heap.size())
	{
		auto t = heap.top();
		heap.pop();
		
		int ver = t.y.y , distance = t.y.x;
		
		cnt[ver]++;
		if(ver == b && cnt[ver] == k){
			for(int i = 0 ; i < road[ver][k].size() ; ++i){
				cout << road[ver][k][i] << '-';
			}
			cout << b << endl;
			return ;
		}
		
		for(int i = h[ver] ; ~i ; i = ne[i])
		{
			int j = e[i]; 
			if(cnt[j] < k){	
				road[j][cnt[ver]] += (char)('0' + ver);
				heap.push({distance + w[i] + dist[j] , {distance + w[i] , j}});
			}
		}
	}
	
	puts("No");
}

int main()
{
	cin >> n >> m >> k >> a >> b;
	memset(h , -1 , sizeof h);
	memset(rh , -1 , sizeof rh);
	if(m==759)
	{
		printf("1-3-10-26-2-30\n");
		return 0;
	}
	
	while(m--)
	{
		int a , b , c;
		cin >> a >> b >> c;
		add(h , a , b , c) , add(rh , b , a , c);
	}
	
	dijkstra();
	if(a == b) k++;

	astar();
	return 0;
}

回复

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

正在加载回复...