萌新刚学OI一仄秒,ILE求改
查看原帖
萌新刚学OI一仄秒,ILE求改
315398
小杨小小杨楼主2022/6/1 10:17

RT,一道dij

#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);
        cout<<endl;
        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);
                cout<<endl;
                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);
                    cout<<endl;
                return 0;
            }
        }
    }
    printf("NO\n");
    cout<<endl;
    return 0;
}
2022/6/1 10:17
加载中...