1. 程式人生 > >L. Magical Girl Haze (分層圖最短路)

L. Magical Girl Haze (分層圖最短路)

分層圖最短路的裸題。

#include<iostream>
#include<stdio.h>
#include<queue>
#define  LL long long
using namespace std;
const int N = 1e5+44;
const int M = 400000+44;
const LL inf = 0x3f3f3f3f3f3f3f3f;

int head[N],nxt[M],to[M],cnt=-1;
int W[M];
void add(int u,int v,int w)
{
	cnt++;
	nxt[cnt]=head[u];
	to[cnt]=v;
	W[cnt]=w;
	head[u]=cnt;
}

LL dis[N][11];
int vis[N][11];

struct node
{
	int u,k;
	LL dis;
	node(int uu,LL dd,int kk):u(uu),dis(dd),k(kk){}
	bool friend operator < (node a,node b)
	{
		return a.dis>b.dis;
	}
};
int n,m,k;
LL dij()
{
	for(int i=1;i<=n;i++)
		for(int j=0;j<=k;j++)
			dis[i][j]=inf,vis[i][j]=0;
	dis[1][0]=0;
	priority_queue<node>q;
	q.push(node(1,0,0));
	while(!q.empty()){
		node now = q.top();
		q.pop();
		int u=now.u;
		int K=now.k;
		if(vis[u][K]) continue;
		vis[u][K]=1;
		for(int i=head[u];~i;i=nxt[i]){
			int v=to[i];
			if(dis[v][K]>dis[u][K]+W[i]){
				dis[v][K]=dis[u][K]+W[i];
				q.push(node(v,dis[v][K],K));
			}
			if(K>=k) continue;
			if(dis[v][K+1]>dis[u][K]){
				dis[v][K+1]=dis[u][K];
				q.push(node(v,dis[v][K+1],K+1));
			}
		}
	}
	return dis[n][k];
}




int main()
{
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d",&n,&m,&k);
		cnt=0;
		for(int i=1;i<=n;i++) {
			head[i]=-1;
		}
		while(m--){
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			add(u,v,w);
		}
		printf("%lld\n",dij());
	}
	return 0;
}