蒟蒻求助 91分 第三个点挂了
查看原帖
蒟蒻求助 91分 第三个点挂了
262074
LoverBoyInMacau楼主2020/10/4 21:06

谢谢dalao QAQ

#include<bits/stdc++.h>
#define re register
#define il inline
#define MAXN 10005
#define MAXM 50005
#define MAXK 25
#define MAX 1983721205
#define fup(i,a,b) for(re int i = a;i <= b;i ++)
#define fedge(i,x) for(re int i = head[x];i;i = e[i].nxt)
#define fin(a)  freopen(#a".in","r",stdin)
#define fout(a) freopen(#a".out","w",stdout)

using namespace std;

int head[9999999],dis[9999999];
bool vis[9999999];
int cnt = 0;
int N,M,K;

il int read()
{
	int w = 0,x = 0;
	char ch = 0;
	
	while(!isdigit(ch))
	{
		w |= ch == '-';
		ch = getchar();
	}
	
	while(isdigit(ch))
	{
		x = (x << 3) + (x << 1) + (ch ^ 48);
		ch = getchar();
	}
	
	return w ? -x : x;
}

il void write(int x)
{
	if(x < 0)
	{
		x = -x;
		putchar('-');
	}
	
	if(x > 9)
		write(x / 10);
		
	putchar(x % 10 + '0');
}

struct edge
{
	int nxt,to,w;
}e[9999999];

il void add(int u,int v,int w)
{
	e[++cnt].to = v;
	e[cnt].w = w;
	e[cnt].nxt = head[u];
	head[u] = cnt;
}

struct node
{
	int num,d;
	bool operator <(const node b)const
	{
		return d>b.d;
	}
};

il void DJ(int s)
{
	memset(dis,0x3f,sizeof(dis));
	
	dis[s]=0;
	priority_queue<node> q;
	
	q.push((node){s,0});
	int u,v;
	while(!q.empty())
	{
		u=q.top().num;q.pop();
		if(vis[u])continue;vis[u]=1;
		fedge(i,u)
		{
			int v=e[i].to;
			if(dis[v]>dis[u]+e[i].w)
			{
				dis[v]=dis[u]+e[i].w;
				q.push((node){v,dis[v]});
			}
		}
	}
}



int main()
{
	fin(P2939);
	fout(P2939);
	
	N = read();M = read();K = read();
	
	
	fup(i,1,M)
	{
		int u = read(),v = read(),w = read();
		
		add(u,v,w);
		add(v,u,w);
		
		fup(j,1,K)
		{
			add(u + N * (j - 1),v + N * j,0);//straight
			
			add(u + N * j,v + N * j,w);
			add(v + N * j,u + N * j,w);//forward
		}
	}
	
	DJ(1);
	
	write(dis[N * K + N]);
	
	return 0;
}
2020/10/4 21:06
加载中...