k短路算法

124 篇文章 0 订阅

无重复的点

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

int info[maxn],Prev[20005],to[20005],cst[20005],cnt_e;
inline void Node(int u,int v,int ct){ Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v,cst[cnt_e]=ct; }
int dis[maxn];
vector<int>G[maxn],P[maxn];

struct node
{
	map<int,bool>st;
	queue<int>sk;
	int Dis,loc;
	
	node(){Dis = loc = 0;for(;!sk.empty();sk.pop());st.clear();}
	
	bool operator < (const node&B)const
	{
		return Dis + dis[loc] > B.Dis + dis[B.loc];
	}
}tmp,nxt;

int n,m,s,t;
priority_queue<node>q;
bool vis[maxn];

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1,u,v,w;i<=m;i++) scanf("%d%d%d",&u,&v,&w),Node(u,v,w),G[v].push_back(u),P[v].push_back(w);
	scanf("%d%d",&s,&t);
	memset(dis,0x3f,sizeof dis);
	dis[t] = 0;
	for(int i=1;i<=n;i++)
	{
		int Minloc = -1;
		for(int j=1;j<=n;j++)
			if(!vis[j] && (Minloc == -1 || dis[Minloc] > dis[j]))
				Minloc = j;
		vis[Minloc] = 1;
		for(int j=0,siz=G[Minloc].size();j<siz;j++)
			if(dis[G[Minloc][j]] > dis[Minloc] + P[Minloc][j])
				dis[G[Minloc][j]] = dis[Minloc] + P[Minloc][j];
	}
	
	tmp.st[s] = 1,tmp.sk.push(s),tmp.Dis=0,tmp.loc=s;
	q.push(tmp);
	int K = 3;
	for(;!q.empty() && K;)
	{
		tmp = q.top() , q.pop();
		if(tmp.loc == t)
		{
			K--;
			printf("%d:",tmp.Dis);
			for(;!tmp.sk.empty();tmp.sk.pop()) printf(" %d",tmp.sk.front());
			puts("");
		}
		for(int i=info[tmp.loc];i;i=Prev[i])
			if(!tmp.st[to[i]])
			{
				nxt=tmp;
				nxt.loc = to[i] , nxt.Dis = tmp.Dis + cst[i],
				nxt.st[to[i]] = 1, nxt.sk.push(to[i]);
				q.push(nxt);
			}
	}
	
	if(K) puts("no road");
}

或者可持久化左偏树

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值