ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

715B Complete The Graph

2019-02-04 14:48:39  阅读:297  来源: 互联网

标签:nxt cnt Complete int Graph head 20020 include 715B


传送门

题目大意

给出一个图,一些边带权,另一些边等待你赋权(最小赋为1).请你找到一种赋权方式,使得 s 到 t 的最短路为 L
n ≤ 1e3 ,m ≤ 1e4 ,L ≤ 1e9

分析

二分所有边的边权和

使得二分后第p条边权值为k,1~p-1条边权值为inf,剩余边权值为1

对于每种情况跑一次最短路

如果结果小于L则增大点权和否则减少

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define int long long
const int inf = 0x3f3f3f3f;
int n,m,s,t,L,d[10010],vis[10010];
priority_queue<pair<int,int> >q;
struct node {
    int x,y,z;
};
node a[10010];
int head[20020],w[20020],to[20020],nxt[20020],cnt;
vector<int>wh;
inline void add(int i){
    int x=a[i].x,y=a[i].y,z=a[i].z;
    nxt[++cnt]=head[x];
    head[x]=cnt;
    to[cnt]=y;
    w[cnt]=z;
    nxt[++cnt]=head[y];
    head[y]=cnt;
    to[cnt]=x;
    w[cnt]=z;
}
inline void dij(){
    d[s]=0;
    q.push(make_pair(0,s));
    while(!q.empty()){
      int x=q.top().second;
      q.pop();
      if(vis[x])continue;
      vis[x]=1;
      for(int i=head[x];i;i=nxt[i]){
          int y=to[i],z=w[i];
          if(d[y]>d[x]+z){
            d[y]=d[x]+z;
            q.push(make_pair(-d[y],y));
          }
      }
    }
}
inline int ck(int mid){
    int i,j,k;
    for(i=0;i<wh.size();i++){
      a[wh[i]].z=1+min(mid,inf);
      mid-=a[wh[i]].z-1;
    }
    memset(head,0,sizeof(head));
    memset(w,0,sizeof(w));
    memset(to,0,sizeof(to));
    memset(nxt,0,sizeof(nxt));
    cnt=0;
    for(i=1;i<=m;i++)add(i);
    memset(d,0x3f,sizeof(d));
    memset(vis,0,sizeof(vis));
    dij();
    return d[t];
}
signed main(){
    int i,j,k;
    scanf("%lld%lld%lld%lld%lld",&n,&m,&L,&s,&t);
    s++,t++;
    for(i=1;i<=m;i++){
      scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].z);
      a[i].x++,a[i].y++;
      if(!a[i].z)wh.push_back(i);
    }
    int le=0,ri=inf*wh.size();
    if(ck(le)>L||ck(ri)<L){
      puts("NO");
      return 0; 
    }
    puts("YES");
    while(ri-le>1){
      int mid=(le+ri)>>1;
      if(ck(mid)<=L)le=mid;
        else ri=mid;
    }
    ck(le);
    for(i=1;i<=m;i++)printf("%lld %lld %lld\n",a[i].x-1,a[i].y-1,a[i].z);
    return 0;
}

标签:nxt,cnt,Complete,int,Graph,head,20020,include,715B
来源: https://www.cnblogs.com/yzxverygood/p/10351735.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有