zoukankan      html  css  js  c++  java
  • CodeForces 507E Breaking Good 2维权重dij

    题解:
            2维权重dij, 先距离最短, 后改变最小。
     
    在这个题中, 如果要改变最小, 则让更多的可用边放进来。
    然后可以用pre存下关键边。
     
    代码:
    #include<bits/stdc++.h>
    using namespace std;
    #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
    #define LL long long
    #define ULL unsigned LL
    #define fi first
    #define se second
    #define pb push_back
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define lch(x) tr[x].son[0]
    #define rch(x) tr[x].son[1]
    #define max3(a,b,c) max(a,max(b,c))
    #define min3(a,b,c) min(a,min(b,c))
    typedef pair<int,int> pll;
    const int inf = 0x3f3f3f3f;
    const int _inf = 0xc0c0c0c0;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const LL _INF = 0xc0c0c0c0c0c0c0c0;
    const LL mod =  (int)1e9+7;
    const int N = 1e5 + 100;
    vector<pll> vc[N];
    struct Node{
        int o, u, d, p;
        bool operator < (const Node & x) const{
            if(d == x.d) return p > x.p;
            return d > x.d;
        }
    };
    int pre[N];
    int vis[N];
    priority_queue<Node> pq;
    void dij(){
        pq.push({0, 1, 0, 0});
        while(!pq.empty()){
            Node t = pq.top();
            pq.pop();
            if(vis[t.u]) continue;
            vis[t.u] = 1;
            pre[t.u] = t.o;
            for(pll tmp : vc[t.u]){
                if(vis[tmp.fi]) continue;
                pq.push({t.u, tmp.fi, t.d+1, t.p + !tmp.se});
            }
        }
    }
    vector<Node> ans;
    int fpre[N];
    int main(){
        int n, m, u, v, op;
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= m; ++i){
            scanf("%d%d%d", &u, &v, &op);
            vc[u].pb(pll(v, op));
            vc[v].pb(pll(u, op));
        }
        dij();
        int x = n;
        while(x){
            fpre[x] = pre[x];
            x = pre[x];
        }
        for(int i = 1; i <= n; ++i){
            for(pll &t : vc[i]){
                if(t.fi < i){
                    int v = t.fi;
                    if((fpre[i] == v || fpre[v] == i)){
                        if(!t.se)
                            ans.pb({v, i, 1, 0});
                    }
                    else if(t.se)
                        ans.pb({v, i, 0, 0});
                }
            }
        }
        printf("%d
    ", ans.size());
        for(Node & t : ans){
            printf("%d %d %d
    ", t.o, t.u, t.d);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    运算符
    javaScript注意事项
    初识JavaScript.
    tomee.xml
    setenv.bat
    catalina.properties
    tomee 系列问题
    tomee 第一个 远程调用 Message-driven bean(MDB)
    tomee 第一个 远程调用 Session Bean
    Java EE 参考文档及sample
  • 原文地址:https://www.cnblogs.com/MingSD/p/10846864.html
Copyright © 2011-2022 走看看