求助分层图,样例未过
查看原帖
求助分层图,样例未过
539133
q1uple楼主2022/8/26 17:02
#include<bits/stdc++.h>
using namespace std;
#define MAXN 1000005
int k,end1;
struct node
{
	int u1,v1;
};
struct n
{
	int u1,v1;
	friend bool operator <(n a,n b)
	{
		return a.v1>b.v1;
	}
}tmp;
vector<node>p[MAXN];
priority_queue<n>q;
int n,m,s;
int dis[MAXN],vis[MAXN];
void dijkstra()
{
	for(int i=0;i<=n;i++)
	{
		dis[i]=INT_MAX;
	}
	dis[s]=0;
	tmp.u1=s,tmp.v1=0;
	q.push(tmp);
	while(!q.empty())
	{
		int u=q.top().u1;
		q.pop();
		if(vis[u])
			continue;
		vis[u]=1;
		for(int i=0;i<p[u].size();i++)
		{
			if(dis[p[u][i].u1]>(long long)dis[u]+p[u][i].v1)
			{
				dis[p[u][i].u1]=dis[u]+p[u][i].v1;
				tmp.u1=p[u][i].u1,tmp.v1=dis[p[u][i].u1];
				q.push(tmp);
			}
				
		}
	}
}
int main()
{
 	scanf("%d%d%d",&n,&m,&k);
 	scanf("%d%d",&s,&end1);
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		p[x].push_back(node{y,z});
		p[y].push_back(node{x,z});
		for(int j=1;j<=k;j++)
		{
			p[x+j*n].push_back(node{y+j*n,z});
			p[y+j*n].push_back(node{x+j*n,z});
			p[x+j*n-n].push_back(node{y+j*n,0});
			p[y+j*n-n].push_back(node{x+j*n,0});
		}
	}
	dijkstra();
	int maxn=INT_MAX;
	for(int i=0;i<=k;i++)
	{
		maxn=min(dis[end1+i*n],maxn);
	}
	cout<<maxn;
}
2022/8/26 17:02
加载中...