Remmarguts' Date(A* 短路)

Aimeeeeeeeeeeeeeeeeeeee

人是會變的
我從沒想過有一天我會不想放假

一個小小的A*,求出來每一個點到終點的距離作爲估價函數

(顯然這是最樂觀的情況)

然後就是一個搜索了

搜索的key就是估價+走過的距離

並且顯然如果一個點已經被取出了k次,那麼這個點就是不會對第k條路起作用了

那麼就扔掉

Aimee Aimee Aimee

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue> 
using namespace std;
int n,m;
int head[1005][2];
struct b{
	int to;
	int ne;
	int v;
} e[200001][2];
int Aimee[1005];
int x,y,z;
struct nod{
	int po;
	int dis;
	int di;
	friend bool operator < ( nod x, nod y) {
		return x.dis>y.dis;
	} 
};
int s,t,k; 
int dis[1005];
int vis[1005];
priority_queue <nod> q;
nod tem,temm;
int p[2];
void add(int f,int to,int v,int fl){
	p[fl]++;
	e[p[fl]][fl].ne=head[f][fl];
	e[p[fl]][fl].to=to;
	e[p[fl]][fl].v=v;
	head[f][fl]=p[fl];
	return ;
}
void dij(int now){
		memset(dis,0x3f,sizeof(dis));
		dis[t]=0;
		temm.dis=0;
		temm.po=t;
		temm.di=0;
		q.push((temm));
		while(!q.empty()){
			tem=q.top();
			q.pop();
			if(vis[tem.po]){
				continue; 
			}
			vis[tem.po]++;
			int u=tem.po;
			for(int i=head[u][now];i;i=e[i][now].ne){
				int v=e[i][now].to;
				if(dis[v]>dis[u]+e[i][now].v){
					dis[v]=dis[u]+e[i][now].v;
					temm.dis=dis[v];
					temm.po=v;
					temm.di=0;
					q.push(temm );
				}
			}					
		}
}
void Aimeeeeeeeeee(int now){
	memset(vis,0,sizeof(vis));
	while(!q.empty()){
		q.pop();
	}
		temm.dis=dis[s];
		temm.po=s;
		temm.di=0;
		q.push(temm);
		while(!q.empty()){
			tem=q.top();
			q.pop();
		vis[tem.po]++;
			int u=tem.po;
			if(vis[tem.po]==k&&tem.po==t){
				cout<<tem.di<<endl;
				exit(0); 
				return ;
			}
			if(vis[u]>k)
				continue; 
			for(int i=head[u][now];i;i=e[i][now].ne){
				int v=e[i][now].to;
					if(vis[v]>=k)
					continue; 
				temm.dis=tem.di+e[i][now].v+dis[v];
				temm.po=v;
				temm.di=tem.di+e[i][now].v;
				q.push(temm);
			}					
		}
}
signed main(){
	scanf("%ld%ld",&n,&m);
	for(int i=1;i<=m;++i){
		scanf("%ld%ld%ld",&x,&y,&z);
		add(x,y,z,1);
		add(y,x,z,0);
	}
	scanf("%ld%ld%ld",&s,&t,&k); 
	dij(0);
	if(s==t)
	k++;
	Aimeeeeeeeeee(1); 
	cout<<-1<<endl;
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章