求助fct
查看原帖
求助fct
335094
Lucifero楼主2021/5/4 14:37

rt,

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define P pair<int,int>
#define pf first
#define ps second
using namespace std;
class Edge
{
public:
	int u,v,w,next;
}e[2200002];
priority_queue<P,vector<P>,greater<P> > r;
bool road[110002];
int elast[110002],dis[110002],n,link;
void add(int u,int v,int w)
{
	e[++link]=(Edge){u,v,w,elast[u]};
	elast[u]=link;
}
void dijkstra(int u)
{
	int v,i;
	memset(dis,inf,sizeof(dis));
	dis[u]=0;
	r.push(make_pair(dis[u],u));
	while(!r.empty())
	{
		u=r.top().ps,r.pop();
		if (road[u]) continue;
		road[u]=true;
		for(i=elast[u];i!=0;i=e[i].next)
		{
			v=e[i].v;
			if (dis[v]>dis[u]+e[i].w)
			{
				dis[v]=dis[u]+e[i].w;
				r.push(make_pair(dis[v],v));
			}
		}
	}
}
int main()
{
	//[JLOI2011]飞行路线
	int m,k,s,t,a,b,c,i;
	scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
	s++,t++;
	while(m--)
	{
		scanf("%d%d%d",&a,&b,&c);
		a++,b++;
		add(a,b,c),add(b,a,c);
		for(i=1;i<=k;i++)
		{
			add(a+(i-1)*n,b+i*n,0),add(b+(i-1)*n,a+i*n,0);
			add(a+i*n,b+i*n,c),add(b*i*n,a+i*n,c);
		}
	}
	for(i=1;i<=k;i++) add(t+(i-1)*n,t+i*n,0);
	dijkstra(s);
	printf("%d",dis[t+k*n]);
}
2021/5/4 14:37
加载中...