zoukankan      html  css  js  c++  java
  • codeforces DIV2 D 最短路

    http://codeforces.com/contest/716/problem/D

    题目大意:给你一些边,有权值,权值为0的表示目前该边不存在,但是可以把0修改成另外一个权值。现在,我们重新建路,问让s-t的最短路能否刚好是L?

    思路:暴力修改即可。。。

    //看看会不会爆int!数组会不会少了一维!
    //取物问题一定要小心先手胜利的条件
    #include <bits/stdc++.h>
    using namespace std;
    #define LL long long
    #define ALL(a) a.begin(), a.end()
    #define pb push_back
    #define mk make_pair
    #define fi first
    #define se second
    #define haha printf("haha
    ")
    const int maxn = 1000 + 5;
    const LL inf = 1e17;
    struct Edge{
        int from, to; LL val;
        Edge(int u = 0, int v = 0, LL val = 0): from(u), to(v), val(val){}
    };
    vector<Edge> G[maxn];
    vector<Edge> zero;
    vector<Edge> realroad;
    int n, m, s, t;
    LL L;
    LL d[maxn];
    
    void dijstra(int s){
        queue<int> que;
        for (int i = 0; i < n; i++) d[i] = inf;
        que.push(s);
        d[s] = 0;
        while (!que.empty()){
            int u = que.front(); que.pop();
            int len = G[u].size();
            for (int i = 0; i < len; i++){
                Edge &e = G[u][i];
                if (d[e.to] > d[u] + e.val){
                    d[e.to] = d[u] + e.val;
                    que.push(e.to);
                }
            }
        }
    }
    
    int main(){
        cin >> n >> m >> L >> s >> t;
        for (int i = 0; i < m; i++){
            int u, v; LL val; scanf("%d%d%I64d", &u, &v, &val);
            if (val != 0) {
                G[u].push_back(Edge(u, v, val)), G[v].push_back(Edge(v, u, val));
                realroad.push_back(Edge(u, v, val));
            }
            else if (val == 0) zero.push_back(Edge(u, v, val));
        }
        dijstra(s);
        ///printf("d[t] = %I64d
    ", d[t]);
        if (d[t] < L) {
            printf("NO
    "); return 0;
        }
        else if (d[t] == L){
            printf("YES
    ");
            for (int i = 0; i < realroad.size(); i++){
                printf("%d %d %I64d
    ", realroad[i].from, realroad[i].to, realroad[i].val);
            }
            for (int i = 0; i < zero.size(); i++){
                printf("%d %d %I64d
    ", zero[i].from, zero[i].to, inf);
            }
            return 0;
        }
    
        for (int i = 0; i < zero.size(); i++){
            Edge &e = zero[i];
            G[e.from].push_back(Edge(e.from, e.to, 1));
            G[e.to].push_back(Edge(e.to, e.from, 1));
            e.val = 1;
            dijstra(s);
            if (d[t] <= L){
                e.val = L - d[t] + 1;
                break;
            }
        }
        if (d[t] > L) printf("NO
    ");
        else {
            printf("YES
    ");
            for (int i = 0; i < realroad.size(); i++){
                printf("%d %d %I64d
    ", realroad[i].from, realroad[i].to, realroad[i].val);
            }
            for (int i = 0; i < zero.size(); i++){
                if (zero[i].val == 0)printf("%d %d %I64d
    ", zero[i].from, zero[i].to, inf);
                else printf("%d %d %I64d
    ", zero[i].from, zero[i].to, zero[i].val);
            }
        }
    
        return 0;
    }
    View Code
    /看看会不会爆int!数组会不会少了一维!//取物问题一定要小心先手胜利的条件#include<bits/stdc++.h>usingnamespace std;#define LL longlong#define ALL(a) a.begin(), a.end()#define pb push_back
    #define mk make_pair
    #definefi first
    #define se second
    #define haha printf("haha
    ")constint maxn =1000+5;const LL inf =1e17;structEdge{intfrom, to; LL val;Edge(int u =0,int v =0, LL val =0):from(u), to(v), val(val){}};
    vector<Edge> G[maxn];
    vector<Edge> zero;
    vector<Edge> realroad;int n, m, s, t;
    LL L;
    LL d[maxn];void dijstra(int s){
        queue<int> que;for(int i =0; i < n; i++) d[i]= inf;
        que.push(s);
        d[s]=0;while(!que.empty()){int u = que.front(); que.pop();int len = G[u].size();for(int i =0; i < len; i++){Edge&e = G[u][i];if(d[e.to]> d[u]+ e.val){
                    d[e.to]= d[u]+ e.val;
                    que.push(e.to);}}}}int main(){
        cin >> n >> m >> L >> s >> t;for(int i =0; i < m; i++){int u, v; LL val; scanf("%d%d%I64d",&u,&v,&val);if(val !=0){
                G[u].push_back(Edge(u, v, val)), G[v].push_back(Edge(v, u, val));
                realroad.push_back(Edge(u, v, val));}elseif(val ==0) zero.push_back(Edge(u, v, val));}
        dijstra(s);///printf("d[t] = %I64d
    ", d[t]);if(d[t]< L){
            printf("NO
    ");return0;}elseif(d[t]== L){
            printf("YES
    ");for(int i =0; i < realroad.size(); i++){
                printf("%d %d %I64d
    ", realroad[i].from, realroad[i].to, realroad[i].val);}for(int i =0; i < zero.size(); i++){
                printf("%d %d %I64d
    ", zero[i].from, zero[i].to, inf);}return0;}for(int i =0; i < zero.size(); i++){Edge&e = zero[i];
            G[e.from].push_back(Edge(e.from, e.to,1));
            G[e.to].push_back(Edge(e.to, e.from,1));
            e.val =1;
            dijstra(s);if(d[t]<= L){
                e.val = L - d[t]+1;break;}}if(d[t]> L) printf("NO
    ");else{
            printf("YES
    ");for(int i =0; i < realroad.size(); i++){
                printf("%d %d %I64d
    ", realroad[i].from, realroad[i].to, realroad[i].val);}for(int i =0; i < zero.size(); i++){if(zero[i].val ==0)printf("%d %d %I64d
    ", zero[i].from, zero[i].to, inf);else printf("%d %d %I64d
    ", zero[i].from, zero[i].to, zero[i].val);}}return0;}
  • 相关阅读:
    Object类的方法简记
    run()和start()调用问题简记
    面向对象设计
    关于JVM的简记
    操作运算符的简记
    jdbc简记
    synchronized的简记
    垃圾回收的一些简记
    java.io.IOException: Stream closed
    Java-文件名、目录名或卷标语法不正确
  • 原文地址:https://www.cnblogs.com/heimao5027/p/5914656.html
Copyright © 2011-2022 走看看