求大佬找错
查看原帖
求大佬找错
189342
Mr_Greeper楼主2020/5/5 17:00

RT,46分,萌新刚学分层图,代码如下,三四六七八九WA其他AC,谢谢大佬

#include<iostream>
#include<queue>
using namespace std;
long long n,m,f,t,v,start,k,l,ans=0x3f3f3f,to;
struct edge
{
	int t,v,n;
}e[10000000];
struct gl
{
	int i;
	long long sum;
}poi;
long long  dis[100000000];
bool vis[10000000];
long long top,head[10000000];
priority_queue < gl > q;
bool operator < (gl a,gl b)
{
	return a.sum>b.sum;
}
void add_edge(int f,int t,int v)
{
	top++;
	e[top].t=t;
	e[top].v=v;
	e[top].n=head[f];
	head[f]=top;
}
void Dijstra()
{
	poi.i=start;
	poi.sum=0;
	q.push(poi);
	for(int i=1;i<=n*(k+1);i++)dis[i]=2147483647;
	dis[start]=0;
	while(!q.empty())
	{
		l=q.top().i;
		q.pop();
		if(vis[l])continue;
		vis[l]=1;
		for(int i=head[l];i;i=e[i].n)
		{
			
			if(dis[e[i].t]>dis[l]+e[i].v)
			{
				dis[e[i].t]=dis[l]+e[i].v;
				poi.i=e[i].t;
				poi.sum=dis[e[i].t];
				q.push(poi);
			}
		}
	}
	for(int i=1;i<=k+1;i++)ans=min(ans,dis[to*i]);
}
int main()
{
	cin>>n>>m>>k>>start>>to;
	start+=1;
	to+=1;
	for(int i=1;i<=m;i++)
	{
		cin>>f>>t>>v;
		f++;
		t++;
		add_edge(f,t,v);
		for(int j=0;j<=k;j++)
		{
			add_edge(f+n*j,t+n*j,v);
			add_edge(t+n*j,f+n*j,v);
			if(j<k)
			{
				add_edge(f+n*j,t+n*(j+1),0);
				add_edge(t+n*j,f+n*(j+1),0);
			}
		}
	}
	Dijstra();
	cout<<ans;
	return 0;
}
2020/5/5 17:00
加载中...