90分分层图蒟蒻
查看原帖
90分分层图蒟蒻
234582
zpl__hhd楼主2020/11/29 10:47
#include <bits/stdc++.h>
using namespace std;
const int maxn=20010,maxm=50010;
long long n,m,k,cnt;
long long head[100*maxn],dis[100*maxn];
bool vis[100*maxn];
struct poi
{
	int pos,v;
	bool operator < (const poi &x)const
	{
		return x.v<v;
	}
};
struct edge
{
	long long t,w,next;
}e[200*maxm];
inline void add(int f,int t,int w)
{
	e[++cnt].t=t;
	e[cnt].w=w;
	e[cnt].next=head[f];
	head[f]=cnt;
}
void dij()
{
	priority_queue<poi> q;
	q.push((poi){1,0});
	for(int i=1;i<=33*n;i++)
	dis[i]=0x7fffffff;
	memset(vis,false,sizeof(vis));
	dis[1]=0;
	while(q.size())
	{
		int x=q.top().pos;
		q.pop();
		if(vis[x])continue;
		vis[x]=true;
		for(int i=head[x];i;i=e[i].next)
		{
			int y=e[i].t,v=e[i].w;
			if(dis[y]>dis[x]+v)
			{
				dis[y]=dis[x]+v;
				if(!vis[y])
				q.push((poi){y,dis[y]});
			}
	    }
	}
}
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
		for(int j=1;j<=k;j++)
		{
			add(u+n*j,v+n*j,w);
			add(v+n*j,u+n*j,w);
			add(v+(j-1)*n,u+j*n,w/2);
			add(u+(j-1)*n,v+j*n,w/2);
		}
	}
	dij();
	long long ans=dis[n];
	for(int i=1;i<=k;i++)
	ans=min(ans,dis[i*n+n]);
	cout<<ans;
}
2020/11/29 10:47
加载中...