题目链接:

http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3946

题解:

用dijkstra跑单元最短路径,如果对于顶点v,存在一系列边(ui,v)使得dis[v]最小(dis[v]表示0到v的距离)。这些边能且只能选一条,那么我们自然应该选cost最小的那个边了。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std; typedef long long LL;
const int maxn = 1e5 + ; struct Edge {
int ne, u, v, c, d;
Edge(int ne, int u, int v, int d, int c) :ne(ne), u(u), v(v), d(d), c(c) {}
Edge() {}
}egs[maxn * ]; struct Heap {
int u, d, c;
Heap(int u, int d) :u(u), d(d) {}
Heap() {}
bool operator < (const Heap& tmp) const {
return d>tmp.d;
}
}; struct Node {
int u, v, w;
bool operator < (const Node& tmp) const {
return w<tmp.w;
}
}nds[maxn]; int head[maxn], tot; void addEdge(int u, int v, int d, int c) {
egs[tot] = Edge(head[u], u, v, d, c);
head[u] = tot++;
} int n, m;
LL ans_d, ans_c; LL dis[maxn];
//pre[u]记录u和前驱节点的那条边的cost
int pre[maxn];
bool done[maxn]; void dij() {
for (int i = ; i<n; i++) {
dis[i] = 2e10;
}
memset(done, false, sizeof(done));
priority_queue<Heap> pq;
dis[] = ;
pq.push(Heap(, ));
while (!pq.empty()) {
Heap x = pq.top(); pq.pop();
int u = x.u;
if (done[u]) continue;
done[u] = true;
int p = head[u];
while (p != -) {
Edge &e = egs[p];
if (dis[e.v]>dis[u] + e.d) {
dis[e.v] = dis[u] + e.d;
pre[e.v] = e.c;
pq.push(Heap(e.v, dis[e.v]));
}
else if (dis[e.v] == dis[u] + e.d) {
//这里贪心选cost最小的边
if (pre[e.v]>e.c)
pre[e.v] = e.c;
}
p = e.ne;
}
}
ans_d = ; ans_c = ;
for (int i = ; i<n; i++) {
ans_d += dis[i];
}
for (int i = ; i<n; i++) {
ans_c += pre[i];
}
} void init() {
memset(head, -, sizeof(head));
memset(pre, -, sizeof(pre));
tot = ;
} int main() {
// freopen("data_in.txt","r",stdin);
int tc;
scanf("%d", &tc);
while (tc--) {
scanf("%d%d", &n, &m);
init();
for (int i = ; i<m; i++) {
int u, v, d, c;
scanf("%d%d%d%d", &u, &v, &d, &c);
addEdge(u, v, d, c);
addEdge(v, u, d, c);
}
dij();
printf("%lld %lld\n", ans_d, ans_c);
}
return ;
}

最新文章

  1. 在Android中Intent的概念及应用(一)——显示Intent和隐式Intent
  2. WordPress上传含有中文文件出现乱码
  3. servlet配置restful
  4. struts 文件上传
  5. android xml解析添加到listview中的问题
  6. img 默认是行内元素,它旁边的空格是会保留的
  7. C语言第二节概述
  8. android界面优化笔记(TODO)
  9. 教你如何用Qt做透明的窗体,setMask, Opacity
  10. 以字符串形式读取github上.json文件
  11. extern外部方法使用C#简单样例
  12. ListView分割线
  13. Chapter 16_2 继承
  14. python识别图片文字
  15. 【转】STM32 FSMC总线深入研究
  16. Spring Boot(Spring的自动整合框架)
  17. Spring boot + mybatis + orcale
  18. qDeleteAll 之后必须清空容器
  19. 简单的django配置和命令
  20. 《Python3网络爬虫开发实战》PDF+源代码+《精通Python爬虫框架Scrapy》中英文PDF源代码

热门文章

  1. Ruby中Enumerable模块的一些实用方法
  2. 一道hive面试题:explode map字段
  3. 对Prolog的感想和我写的一些教程
  4. 20155236 《信息安全概论》实验二(Windows系统口令破解)实验报告
  5. Win10系统下VirtualBox虚拟机初体验
  6. 20155338 2016-2017-2《Java程序设计》第1周学习总结
  7. MySQL优化Explain命令简介(一)
  8. python 多线程笔记(1)-- 概念
  9. Linux安装gitlab
  10. Retinex图像增强和暗通道去雾的关系及其在hdr色调恢复上的应用