其他分享
首页 > 其他分享> > 洛谷 P4568 [JLOI2011]飞行路线

洛谷 P4568 [JLOI2011]飞行路线

作者:互联网

链接:

P4568

题目描述

Alice 和 Bob 现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在 \(n\) 个城市设有业务,设这些城市分别标记为 \(0\) 到 \(n-1\),一共有 \(m\) 种航线,每种航线连接两个城市,并且航线有一定的价格。

Alice 和 Bob 现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多 \(k\) 种航线上搭乘飞机。那么 Alice 和 Bob 这次出行最少花费多少?


分析:

\(0\leq k\leq10\),分层图裸题。


code:

#include<bits/stdc++.h>
using namespace std;
#define in read()
inline int read(){
	int p=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
	return p*f;
}
const int N=1e4+5;
const int M=1e5+5;
const int K=15;
int n,m,k,s,t;
struct edge{
	int v,w,next;
}e[M];
int head[N],en;
inline void insert(int u,int v,int w){
	e[++en].v=v;
	e[en].w=w;
	e[en].next=head[u];
	head[u]=en;
}
inline void add(int u,int v,int w){
	insert(u,v,w);
	insert(v,u,w);
}
struct node{
	int u,dis,k;
};
bool operator<(const node &p,const node &q){
	return p.dis<q.dis;
}
priority_queue<node> q;
int vis[N][K];
int dijkstra(){
	memset(vis,0,sizeof(vis));
	node temp;
	temp.dis=0;
	temp.k=k;
	temp.u=s;
	q.push(temp);
	while(!q.empty()){
		int u=q.top().u,dis=-q.top().dis,tk=q.top().k;q.pop();
		if(u==t)return dis;
		if(vis[u][tk])continue;
		vis[u][tk]=1;
		for(int i=head[u];i;i=e[i].next){
			int v=e[i].v,w=e[i].w;
			temp.dis=-(dis+w);
			temp.k=tk;
			temp.u=v;
			q.push(temp);
			if(tk){
				temp.dis=-dis;
				temp.k=tk-1;
				temp.u=v;
				q.push(temp);	
			}
		}
	}
}
signed main(){
	n=in,m=in,k=in,s=in,t=in;
	s++,t++;
	for(int i=1;i<=m;i++){
		int u=in+1,v=in+1,w=in;
		add(u,v,w);
	}
	cout<<dijkstra();
	return 0;
}

标签:航线,洛谷,JLOI2011,temp,int,P4568,vis,tk,dis
来源: https://www.cnblogs.com/llmmkk/p/15099726.html