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;
}