分层图 0 分求助
查看原帖
分层图 0 分求助
822239
ncwzdlsd楼主2023/2/9 09:48

不知道为啥,样例 输出了一个极大值

#include <bits/stdc++.h>
using namespace std;

const int maxn=20005,maxm=50005;
int nxt[maxm*25],w[maxm*25],to[maxm*25],head[maxm*25],cnt,diss[maxn*25];

void add(int x,int y,int z)
{
	to[++cnt]=y;
	w[cnt]=z;
	nxt[++cnt]=head[x];
	head[x]=cnt;
}

struct node
{
	int u,dis;
	friend bool operator < (node a,node b)
	{
		return a.dis>b.dis;//小顶堆!
	}
};

priority_queue<node> q;

//Dijkstra模板,今天终于彻底搞明白了
void dij(int s)//s表示源点
{
	memset(diss,0x3f,sizeof(diss));
	diss[s]=0;
	q.push(node{s,0});
	while(!q.empty())
	{
		node gg=q.top();q.pop();
		int u=gg.u,dis=gg.dis;
		if(dis!=diss[u]) continue;
		for(int i=head[u];i;i=nxt[i])
			if(diss[to[i]]>diss[u]+w[i])
			{
				diss[to[i]]=diss[u]+w[i];
				q.push(node{to[i],diss[to[i]]});
			}
	}
}

signed main()
{
	int N,M,K;cin>>N>>M>>K;
	int ss,tt;cin>>ss>>tt;
	for(int i=1;i<=M;i++)
	{
		int a,b,c;cin>>a>>b>>c;add(a,b,c);add(b,a,c);
		for(int j=1;j<=K;j++)
		{
			add(a+N*(j-1),b+N*j,0);add(b+N*(j-1),a+N*j,c);//建原图+复制图,即每层图都创造一个和第一层图一样的连线
			add(a+N*j,b+N*j,c),add(b+N*j,a+N*j,c);//建立层与层之间的边,即有高度公路
		}
	}
	for(int i=1;i<=K;++i)
		add(tt+(i-1)*N,tt+i*N,0);
	dij(ss);
	cout<<diss[tt+K*N];
	return 0;
}
2023/2/9 09:48
加载中...