分层图最短路模板求助10关注为报
  • 板块学术版
  • 楼主qip101
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/8/19 10:26
  • 上次更新2023/10/27 14:39:26
查看原帖
分层图最短路模板求助10关注为报
333800
qip101楼主2022/8/19 10:26
#include <bits/stdc++.h> 
#define MAXN 2100010
#define INF 2147483647
using namespace std;
int n,m,k,p,q,b,dis[MAXN];
bool vis[MAXN];
struct edge{
	int v,w;
};
vector <edge> G[MAXN];
struct node{
	int dis,pos;
	bool operator <(const node &x) const
	{
		return x.dis<dis;
	}
};
priority_queue <node> Q;
inline void Dijkstra()
{
	for(int i=0;i<=MAXN;i++)
		dis[i]=INF;
	dis[1]=0;
	Q.push((node){0,1});
	while(!Q.empty())
	{
		node tmp=Q.top();
		Q.pop();
		int x=tmp.pos;
		int d=tmp.dis;
		if(vis[x]==true)
			continue;
		vis[x]=true;
		for(int i=0;i<G[x].size();i++)
		{
			int k=G[x][i].v;
			if(dis[k]>dis[x]+G[x][i].w)
			{
				dis[k]=dis[x]+G[x][i].w;
				if(vis[k]==true)
					Q.push((node){dis[k],k});
			}
		}
	}
}
inline void add(int u,int v,int w)
{
	G[u].push_back((edge){v,w});
}
inline void add_work()
{
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin >> u >> v >> w;
		add(u,v,w);
		add(v,u,w);
		for(int j=1;j<=k;j++)
		{
			int d=floor(p*w/q)+b;
			add(u+(j-1)*n,v+j*n,d);
			add(v+(j-1)*n,u+j*n,d);
			add(u+j*n,v+j*n,w);
			add(v+j*n,u+j*n,w);
		}
	}
	Dijkstra();
}
int main()
{
	cin >> n >> m >> k >> p >> q >> b;
	add_work();
	int ans=INF;
	for(int i=n;i<=n*(k+1);i+=n)
		ans=min(ans,dis[i]);
	cout << ans << endl;
	return 0;
}
2022/8/19 10:26
加载中...