POJ 3013最短路变形....

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;
}

时间: 2024-12-20 14:11:49

POJ 3013最短路变形....的相关文章

Heavy Transportation POJ 1797 最短路变形

Heavy Transportation POJ 1797 最短路变形 题意 原题链接 题意大体就是说在一个地图上,有n个城市,编号从1 2 3 ... n,m条路,每条路都有相应的承重能力,然后让你求从编号为1的城市到编号为n的城市的路线中,最大能经过多重的车. 解题思路 这个题可以使用最短路的思路,不过转移方程变了\(dis[j]=max(dis[j], min(dis[u], e[u][j]))\).这里dis[j]表示从标号为1的点到达编号为j的点的路径中,最小的承重能力,就像短板效应样

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA)

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n,树根为编号1,选择一些边,使得所有节点构成一棵树,选择边的代价是(子孙的点的重量)×(这条边的价值).求代价最小多少. 分析: 单看每个点被计算过的代价,很明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 不过坑点还是很多的. 点的数量高达5w个,用矩阵存不行,只能用边存. 还有路径和结

POJ 1797 Heavy Transportation (最短路变形)

Heavy Transportation Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 20364   Accepted: 5401 Description Background Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man

poj 3013 Big Christmas Tree (dij+优先队列优化 求最短路)

模板 题意:给你一个图,1总是为根,每个边有单位价值,每个点有权重. 每条边的价值 = sum(后继节点权重)*边的单位价值. 求树的最小价值,即构成一棵树的n-1条边的最小价值. 算法: 1.因为每个边的价值都要乘以后来访问的节点的权重,而走到后来访问的点必经过这条边. 实际上总价值就是  到每个点的最短路径*这个点的权重. 2.但是这个题 数据量真的太大了,50000个点,50000条边. 写普通的dij算法tle. 必须加优先队列优化- - 据说spfa也能过,但是spfa算法不稳定- -

POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)

POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意: 圣诞树是由n个节点和e个边构成的,点编号1-n.树根为编号1,选择一些边.使得全部节点构成一棵树.选择边的代价是(子孙的点的重量)×(这条边的价值). 求代价最小多少. 分析: 单看每一个点被计算过的代价,非常明显就是从根到节点的边的价值.所以这是个简单的单源最短路问题. 只是坑点还是非常多的. 点的数量高达5w个,用矩阵存不行.仅仅能用边存. 还

POJ2253&amp;ZOJ1942--Frogger【SPFA】单源最短路变形

链接:http://poj.org/problem?id=2253 题意:一个青蛙在一块石头上,看到了另一个青蛙在另一块石头上,它想跳过去找它,如果距离太远它就需要借助别的石头当跳板,两块石头之间的青蛙距离被定义成两块石头之间所有路径中最大跳跃距离的最小值,求两个青蛙之间的青蛙距离. poj2263和它类似,链接:http://poj.org/problem?id=2263 解题报告:Here 这是最短路的变形,每两点之间都有路可以跳,更新最短路的值,权值记录成目前到这一点的最小青蛙距离就行了

POJ2263&amp;ZOJ1952--Heavy Cargo【Floyd】多源最短路变形

链接:http://poj.org/problem?id=2263 题意:有n个点,m条路,每条路双向的,现在卡车从某点到另一点,卡车的承载无上限,但是马路的承载有上限,问卡车应该承载多少才不会压坏马路. poj2253和它类似,链接:http://poj.org/problem?id=2253 解题报告:Here 就是在两点之间找一条路径,使路径中权值最小的那条边的权值最大,edge数组记录当前路径中最小权值边的权值 #include<cstring> #include<string&

URAL 1934 Black Spot --- 简单最短路变形

边权为1,在维护最短路的同时维护p值最小,我直接存的(1-p),即不遇见的概率,要使得这个值最大. #include <iostream> #include <cstdlib> #include <cstring> #include <string> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #includ

poj 1502 最短路+坑爹题意

链接:http://poj.org/problem?id=1502 MPI Maelstrom Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5249   Accepted: 3237 Description BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distributed share