70分求助
查看原帖
70分求助
485248
振衣千仞岗楼主2021/12/26 23:05
#include<set>
#include<list>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
#define min(a,b) a<b?a:b
inline int read() {
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
		s=(s<<1)+(s<<3)+(ch^48),ch=getchar();
	return s*w;
}
inline void write(int x) {
	if(x>9)	write(x/10);
	putchar(x%10+'0');
}
inline void print(int x,char ch='\n') {
	if(x<0)putchar('-');
	write(__builtin_labs(x));
	putchar(ch);
}
int n=read(),m=read(),k=read(),cnt;
int head[200001],Next[200001],ver[200001],edge[200001];
int d[5001],need[5001];
bool v[5001];
void add(int z,int y,int x) {
	ver[++cnt]=y;
	edge[cnt]=z;
	Next[cnt]=head[x];
	head[x]=cnt;
	ver[++cnt]=x;
	edge[cnt]=z;
	Next[cnt]=head[y];
	head[y]=cnt;
}
priority_queue<pair<int,int> >q;
inline void dij() {
	memset(d,0x3f,sizeof(d));
	memset(need,0x3f,sizeof(need));
	q.push(make_pair(0,1));
	d[1]=0;
	while(!q.empty()) {
		int x=q.top().second,w=-q.top().first,sum=0;
		q.pop();
		for(int i=head[x]; i; i=Next[i])if(ver[i]!=x)sum++;
		if(sum<k&&x!=n&&x!=1)continue;
		for(int i=head[x]; i; i=Next[i])
			if(ver[i]!=x) {
				int y=ver[i],z=edge[i];
				if(d[y]>w+z) {
					need[y]=d[y],d[y]=w+z;
					q.push(make_pair(-d[y],y));
					q.push(make_pair(-need[y],y));
				} else if(need[y]>w+z)
					need[y]=w+z,q.push(make_pair(-need[y],y));
			}
	}
}
signed main() {
	for(int i=1; i<=m; i++)add(read(),read(),read());
	dij();
	print(need[n]>=0x3f3f3f3f3f?-1:need[n]);
	return 0;
}

WA,2,5,6点

2021/12/26 23:05
加载中...