CodeForces 715B.Complete The Graph

题目链接
题意就是一个无向图,其中有些边权值是固定的有些可以设成任意正整数,求出一种方案使得最短路长度为给定的L,n<=1000,m<=1e4

题解:我没先将可修改的边视为断边跑一遍最短路,若长度已经

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

const int MaxM=10005;

int N,M,L,S,T;
int U[MaxM],V[MaxM],W[MaxM];
int Tot,Head[1005],Next[MaxM<<1],To[MaxM<<1],Weight[MaxM<<1];
LL Dis[1005];
bool Vis[1005];

void Add_Edge(int u,int v,int w){
    Next[++Tot]=Head[u];
    To[Tot]=v,Weight[Tot]=w;
    Head[u]=Tot;
}

void Dijkstra(){
    int i,u,v;
    priority_queue<pair<LL,int> > q;
    memset(Vis,false,sizeof(Vis));
    memset(Dis,0x3f,sizeof(Dis));
    Dis[S]=0,q.push(make_pair(0,S));
    while(q.size()){
        u=q.top().second;
        q.pop();
        if(Vis[u])
            continue;
        Vis[u]=true;
        for(i=Head[u];i;i=Next[i])
            if(Dis[v=To[i]]>Dis[u]+Weight[i]){
                Dis[v]=Dis[u]+Weight[i];
                q.push(make_pair(-Dis[v],v));
            }
    }
}

int main(){
    freopen("715B.in","r",stdin);
    freopen("715B.out","w",stdout);
    int i;
    scanf("%d%d%d%d%d",&N,&M,&L,&S,&T);
    for(i=1;i<=M;i++){
        scanf("%d%d%d",&U[i],&V[i],&W[i]);
        if(W[i]){
            Add_Edge(U[i],V[i],W[i]);
            Add_Edge(V[i],U[i],W[i]);
        }
    }
    Dijkstra();
    if(Dis[T]<L){
        puts("NO");
        return 0;
    }
    for(i=1;i<=M;i++)
        if(!W[i]){
            W[i]=1;
            Add_Edge(U[i],V[i],1);
            Add_Edge(V[i],U[i],1);
            Dijkstra();
            if(Dis[T]<L)
                Weight[Tot]=Weight[Tot^1]=W[i]=L-Dis[T]+1;
        }
    Dijkstra();
    if(Dis[T]>L){
        puts("NO");
        return 0;
    }
    puts("YES");
    for(i=1;i<=M;i++)
        printf("%d %d %d\n",U[i],V[i],W[i]);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值