萌新刚学OI,求助一道dij
查看原帖
萌新刚学OI,求助一道dij
315398
小杨小小杨楼主2022/5/31 22:02

RT,莫名其妙UKE,求助(CF显示闲置超限?)

#include<bits/stdc++.h>
using namespace std;
long long n,m,l,s,t,x,y,z,dis[4001],vis[4001],hea[4001],head,tot,i,j,tst,tott;
struct Edge{
	long long z,to,nex; 
}edge[4010];
struct Node{
	int x,y,z;
}a[4010],p[4010];
void ins(int x,int y,int z){
	edge[tot].z=z;
	edge[tot].to=y;
	edge[tot].nex=hea[x];
	hea[x]=tot++;
}
int main(){
	memset(hea,-1,sizeof(hea));
	scanf("%lld%lld%lld%lld%lld",&n,&m,&l,&s,&t);
	for (i=1;i<=m;i++){
		scanf("%lld%lld%lld",&x,&y,&z);
		if (z==0) a[++tott].x=x,a[tott].y=y;
		else ins(x,y,z),ins(y,x,z);
		p[i].x=x;p[i].y=y;p[i].z=z;
	}
	memset(dis,0x3f3f3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	head=s;dis[s]=0;vis[s]=1;
	for (i=1;i<n;i++){
		for (j=hea[head];~j;j=edge[j].nex){
			long long v=edge[j].to;
			if (vis[v]==0) dis[v]=min(dis[v],dis[head]+edge[j].z);
		}
		long long mi=4e10;
		for (j=hea[head];~j;j=edge[j].nex){
			long long v=edge[j].to;
			if (vis[v]==0&&mi>dis[v]) mi=dis[v],head=v;
		}
		if (mi==1e18) break;
	}
	if (dis[t]<l){
		printf("NO\n");
		return 0;
	}
	else if (dis[t]==l){
		printf("YES\n");
		for (i=1;i<=m;i++)
			if (p[i].z==0) printf("%d %d 1000000000000000000\n",p[i].x,p[i].y);
			else printf("%d %d %d\n",p[i].x,p[i].y,p[i].z);
		return 0;
	}
	else{
		for (tst=1;tst<=tott;tst++){
			ins(a[tst].x,a[tst].y,1);
			ins(a[tst].y,a[tst].x,1);a[tst].z=1;
			memset(dis,0x3f3f3f,sizeof(dis));
			memset(vis,0,sizeof(vis));
			head=s;dis[s]=0;vis[s]=1;
			for (i=1;i<n;i++){
				for (j=hea[head];~j;j=edge[j].nex){
					long long v=edge[j].to;
					if (vis[v]==0) dis[v]=min(dis[v],dis[head]+edge[j].z);
				}
				long long mi=1e18;
				for (j=hea[head];~j;j=edge[j].nex){
					long long v=edge[j].to;
					if (vis[v]==0&&mi>dis[v]) mi=dis[v],head=v;
				}
				if (mi==1e18) break;
			}
			if (dis[t]==l){
				printf("YES\n");
				int sum=1;
				for (i=1;i<=m;i++)
					if (p[i].z==0){
						if (sum<=tst) printf("%d %d %d\n",a[sum].x,a[sum].y,a[sum].z),sum++;
						else printf("%d %d 1000000000000000000\n",p[i].x,p[i].y);
					}
					else printf("%d %d %d\n",p[i].x,p[i].y,p[i].z);
				return 0;
			}
			else if (dis[t]<l){
				printf("YES\n");
				a[tst].z=l-dis[t]+1;
				int sum=1;
				for (i=1;i<=m;i++)
					if (p[i].z==0){
						if (sum<=tst) printf("%d %d %d\n",a[sum].x,a[sum].y,a[sum].z),sum++;
						else printf("%d %d 1000000000000000000\n",p[i].x,p[i].y);
					}
					else printf("%d %d %d\n",p[i].x,p[i].y,p[i].z);
				return 0;
			}
		}
	}
	printf("NO\n");
	return 0;
}

2022/5/31 22:02
加载中...