P4568 [JLOI2011]飞行路线

P4568 [JLOI2011]飞行路线

#include <bits/stdc++.h>
using namespace std;

int n,m,k;
int s,t;
struct node
{
	int v,d;
};
struct no1
{
	int v,d,k;
	bool operator < (const no1 &y)const
	{
		if(d == y.d)
		{
			return k > y.k;
		}
		return d > y.d;
	}
};
vector <node> e[10000];
int dis[10000][11];
int vis[10000][11];
int ans;

void dij(int x)
{
	priority_queue<no1> q;
	q.push(no1{x,0,0});
	dis[x][0] = 0;
	while(!q.empty())
	{
		
		no1 v = q.top();
		q.pop();
		if(vis[v.v][v.k])continue;
		if(v.v == t)
		{
			ans = v.d;
			break;
		}
		vis[v.v][v.k] = 1;
		int maxx = e[v.v].size();
		for (int i = 0; i < maxx; i++)
		{
			int u = e[v.v][i].v;
			int d = e[v.v][i].d;
			if(vis[u][v.k] == 0 && dis[u][v.k] > dis[v.v][v.k] + d)//不免费
			{
				dis[u][v.k] = dis[v.v][v.k] + d;
				q.push(no1{u,dis[u][v.k],v.k});
			}
			if(v.k < k && vis[u][v.k + 1] == 0 && dis[u][v.k + 1] > dis[v.v][v.k])//免费
			{
				dis[u][v.k + 1] = dis[v.v][v.k];
				q.push(no1{u,dis[u][v.k + 1],v.k + 1});
			}
		}
	}
}

int main()
{
	int a,b,c;
	cin >> n >> m >> k;
	cin >> s >> t;
	for (int i = 1; i <= m; i++)
	{
		cin >> a >> b >> c;
		e[a].push_back(node{b,c});
		e[b].push_back(node{a,c});
	}
	memset(dis,0x3f,sizeof(dis));
	dij(s);
	cout << ans;
	return 0;
}

分层图最短路板题 

posted @   此间无物  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示