码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3013最短路变形....

时间:2015-09-05 22:22:52      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:

DES:计算输的最小费用。如果不能构成树。输出-1。每条边的费用=所有的子节点权值*这条边的权值。计算第二组样例可以知道树的费用是所有的节点的权值*到根节点的最短路径的长度。

用dij的邻接矩阵形式直接MLE。编译都通不过。换邻接表的形式。然后。。。。模板。。。

技术分享
#include<stdio.h>
#include<string.h>
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
#define maxn 50010
#define inf 10000000000

int head[maxn];
int vis[maxn];
int w[maxn];
long long dis[maxn];
int edgeNum;

struct Edge {
   int v, c, nxt;
}edge[maxn*2];

struct Node {
   int u, dis;
   bool operator < (const Node &a) const {
       return dis > a.dis;
   }
};

void init() {
   edgeNum = 0;
   for (int i=0; i<maxn; ++i) {
     head[i] = -1;
     dis[i] = inf;
     vis[i] = 0;
   }
}

void addEdge(int a, int b, int c) {
    edge[edgeNum].v = b;
    edge[edgeNum].c = c;
    edge[edgeNum].nxt = head[a];
    head[a] = edgeNum++;
}

void Dijkstra(int u) {
    Node temp, now;
    priority_queue<Node>q;
    temp.u = u;
    temp.dis = 0;
    dis[u] = 0;
    q.push(temp);

    while(!q.empty()) {
        temp = q.top();
        q.pop();
        if (vis[temp.u]) continue;
            vis[temp.u] = 1;
        for (int i=head[temp.u]; i!=-1; i=edge[i].nxt) {
            int v = edge[i].v;
            if (!vis[v] && dis[v] > dis[temp.u] + edge[i].c)
            {
                dis[v] = dis[temp.u] + edge[i].c;
                now.u = v;
                now.dis = dis[v];
                q.push(now);
            }
        }
    }
    return;
}

int main() {
    int t, a, b, c, n, m;
    scanf("%d", &t);
    while(t--) {
        init();
        scanf("%d%d", &n, &m);
        for (int i=0; i<n; ++i) {
            scanf("%d", &w[i]);
        }
        for (int i=0; i<m; ++i) {
            scanf("%d%d%d", &a, &b, &c);
            a--, b--;
            addEdge(a, b, c);
            addEdge(b, a, c);
        }
        Dijkstra(0);
        int i;
        long long ans = 0;
        for (i=0; i<n; ++i) {
          if (dis[i] == inf) {
              break;
          }
          ans += dis[i] * w[i];
        }
        if (i == n)printf("%lld\n", ans);
        else printf("No Answer\n");
    }
    return 0;
}
View Code

 

POJ 3013最短路变形....

标签:

原文地址:http://www.cnblogs.com/icode-girl/p/4783974.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!