90pts 求助
查看原帖
90pts 求助
342494
wxh666楼主2022/10/11 17:05
#include<bits/stdc++.h>
#define int long long
using namespace std;

typedef int lsqxx;
struct lq{
	lsqxx v,w,nxt;
}e[200005];
lsqxx h[200005],cnt;
void add(lsqxx u,lsqxx v,lsqxx w)
{
	e[++cnt].v=v,e[cnt].w=w,e[cnt].nxt=h[u],h[u]=cnt;
}

int n,m,k;
int x,y,z;
int ans[200005],vis[200005];
queue<int>q;
void spfa()
{
	while(!q.empty())
	{
		int x=q.front();q.pop();
		vis[x]=0;
		for(int i=h[x];i;i=e[i].nxt)
		{
			if(ans[x]+e[i].w<ans[e[i].v])
			{
				ans[e[i].v]=ans[x]+e[i].w;
				if(!vis[e[i].v]) vis[e[i].v]=1,q.push(e[i].v);
			}
		}
	}
}
signed main()
{
	cin>>n>>m>>k;
	memset(ans,0x7f,sizeof(ans));
	ans[1]=0;
	for(int i=1;i<=m;i++)
	{
		scanf("%lld%lld%lld",&x,&y,&z);
		for(int ok=0;ok<=k;ok++)
			for(int oks=ok;oks<=k;oks++)
				if(ok==oks) add(x+ok*n,y+oks*n,z),add(y+ok*n,x+oks*n,z);
				else add(x+ok*n,y+oks*n,z/2),add(y+ok*n,x+oks*n,z/2);
	}
	q.push(1);
	spfa();
	int minx=0x7f7f7f7f;
	for(int i=0;i<=k;i++)
		minx=min(minx,ans[i*n+n]);
	cout<<minx<<endl;
    return 0;
}

2022/10/11 17:05
加载中...