蒟蒻54分的代码,re了好多点,求助!!!
查看原帖
蒟蒻54分的代码,re了好多点,求助!!!
230857
鹿目圆楼主2021/7/8 19:41
#include<bits/stdc++.h>
#define MAXN 10001000
using namespace std;
struct Edge
{
	int to,w,nxt;
}edge[MAXN];
struct priority
{
	int id,w;
	bool operator <(const priority &x)const{return w>x.w;}
};
priority_queue<priority>que;
int head[MAXN];
int cnt=0;
void add_edge(int from,int to,int w)
{
	cnt++;
	edge[cnt].to=to;
	edge[cnt].w=w;
	edge[cnt].nxt=head[from];
	head[from]=cnt;
}
int dis[MAXN];
bool vis[MAXN];
int n,m,k;
int s;
int ans=1e9;
void djikstra(int s)
{
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	que.push((priority){s,0});
	dis[s]=0;
	while(!que.empty())
	{
		priority x=que.top();
		que.pop();
		k=x.id;
		if(vis[k]) continue;
		vis[k]=1;
		for(int i=head[k];i;i=edge[i].nxt)
		{
			int to=edge[i].to;
			if(dis[to]>dis[k]+edge[i].w)
			{
				dis[to]=dis[k]+edge[i].w;
				que.push((priority){to,dis[to]});
			}
		}
	}
}
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		add_edge(x,y,z);
		add_edge(y,x,z);
		for(int j=1;j<=k;j++)
		{
			add_edge(j*n+x,j*n+y,z);
			add_edge(j*n+y,j*n+x,z);
			add_edge((j-1)*n+x,j*n+y,0);
			add_edge((j-1)*n+y,j*n+x,0);
		}
	}
	djikstra(1);
	for(int i=1;i<=k;i++)
	{
		ans=min(ans,dis[i*n]);
	}
	cout<<ans;
} 
2021/7/8 19:41
加载中...