zoukankan      html  css  js  c++  java
  • zoj 3946 Highway Project

    我TM建个前向星的双向边MAXN只开100005???还一直不报WA,一直以为我是哪里没考虑到。。。。

    一定要注意数组大小了。思路很简单,从0到其他点的最短路距离是一定的,那要求最小花费,那就边跑最短路边更新最小花费呗。

    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    #include<string>
    #include<set>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<list>
    #include<cmath>
    #include<cstring>
    #include<map>
    #include<stack>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define maxn 200005
    #define ull unsigned long long
    #define ll long long
    #define hashmod 99999839
    #define mod 7
    #define repe(x,y,i) for(i=x;i<=y;++i)
    #define repne(x,y,i) for(i=x;i<y;++i)
    #define MAX(x,y) (x) < (y) ? (y) : (x);
    #define MIN(x,y) (x) < (y) ? (x) : (y);
    int n,m,x,y,d,c;
    struct edge{
        int to,d,c,next;
    }G[maxn];
    int head[maxn],len;
    ll dis[maxn],micost[maxn];
    bool vis[maxn];
    void addedge(){
        G[len].to = y,G[len].d = d,G[len].c = c,G[len].next = head[x];
        head[x] = len;
        len++;
        G[len].to = x,G[len].d = d,G[len].c = c,G[len].next = head[y];
        head[y] = len;
        len++;
    }
    void SPFA(){
        queue<int> q;
        memset(dis,0x3f,sizeof(dis));
        memset(micost,0x3f,sizeof(micost));
        memset(vis,false,sizeof(vis));
        q.push(0);
        dis[0] = micost[0] = 0;
        vis[0] = true;
        while(!q.empty()){
            int v = q.front();
            q.pop();
            vis[v] = false;
            for(int i = head[v];i != -1;i = G[i].next){
                edge& t = G[i];
                if(dis[t.to] > dis[v] + t.d){
                    dis[t.to] = dis[v] + t.d;
                    micost[t.to] = t.c;
                    if(!vis[t.to]) q.push(t.to);
                }
                else if(dis[t.to] == dis[v] + t.d && micost[t.to] > t.c) micost[t.to] = t.c;
            }
        }
    }
    int main(){
      //  freopen("a.in","r",stdin);
      //  freopen("b.out","w",stdout);
        int T;
        register int i,j;
        cin >> T;
        while(T--){
            scanf("%d%d",&n,&m);
            memset(head,-1,sizeof(head));
            len = 0;
            repe(1,m,i){
                scanf("%d%d%d%d",&x,&y,&d,&c);
                addedge();
            }
            SPFA();
            ll sc,st;
            sc = st = 0;  
            repne(0,n,i) st += dis[i],sc += micost[i];
            printf("%lld %lld
    ",st,sc);
        }
        return 0;
    }
  • 相关阅读:
    次小生成树
    [bzoj5329] P4606 [SDOI2018]战略游戏
    CF487E Tourists
    P3225 [HNOI2012]矿场搭建
    CF #636 (Div. 3) 对应题号CF1343
    P3469 [POI2008]BLO-Blockade
    大假期集训模拟赛12
    大假期集训模拟赛11
    大假期集训模拟赛10
    小奇画画——BFS
  • 原文地址:https://www.cnblogs.com/zhuiyicc/p/9558600.html
Copyright © 2011-2022 走看看