HNU 13375 Flowery Trails (spfa最短路)

求最短路径覆盖的全部边权值和。

思路:分别从起点和终点两次求最短路,再比较两个点到起点的距离和他们之间的权值相加和是否等于最短路径。

这题很好

 1 #include <cstring>
 2 #include <cmath>
 3 #include <queue>
 4 #include <vector>
 5 #include <cstdio>
 6 #include <algorithm>
 7 using namespace std;
 8 typedef long long ll;
 9 const int maxn = 10005;
10 const int maxm = 600000;
11 const int INF = 0x3f3f3f3f;
12 int n, m;
13 struct ee {
14     int to;
15     int nxt;
16     int w;
17 } edge[maxm];
18
19 int head[maxn], tol;
20 void init() {
21     memset(head, -1, sizeof head );
22     tol = 0;
23 }
24 void add(int u, int v, int w) {
25     edge[tol].to = v;
26     edge[tol].w = w;
27     edge[tol].nxt = head[u];
28     head[u] = tol++;
29 }
30 int d1[maxn], d2[maxn];
31 bool vis[maxn];
32 void spfa(int s, int t, int d[]) {
33     for(int i=0; i<n; ++i) d[i] = INF;
34     memset(vis, false, sizeof vis );
35     queue<int> q;
36     q.push(s);
37     d[s] = 0;
38     vis[s] = true;
39     while(!q.empty()) {
40         int u = q.front();
41         q.pop();
42         vis[u] = false;
43         for(int i=head[u]; ~i; i=edge[i].nxt) {
44             int &v = edge[i].to;
45             int &cost = edge[i].w;
46             if(d[v] > d[u] + cost) {
47                 d[v] = d[u] + cost;
48                 if(!vis[v]) {
49                     vis[v] = true;
50                     q.push(v);
51                 }
52             }
53         }
54     }
55 }
56 void solve() {
57     int s = 0, t = n-1;
58     spfa(s, t, d1);
59     spfa(t, s, d2);
60     ll ans = 0;
61     int minn = d1[t];
62     for(int u=0; u<n; u++) {
63         for(int i=head[u]; ~i; i=edge[i].nxt) {
64             int &v=edge[i].to;
65             int &cost=edge[i].w;
66             if(d1[u]+d2[v]+cost==minn) {
67                 ans+=cost;
68             }
69         }
70     }
71     printf("%I64d\n", ans*2);
72 }
73 int main() {
74     int u, v, l;
75     while(~scanf("%d%d", &n, &m)) {
76         init();
77         for(int i=0; i<m; ++i) {
78             scanf("%d%d%d", &u, &v, &l);
79             add(u, v, l);
80             add(v, u, l);
81         }
82         solve();
83     }
84     return 0;
85 }

时间: 2024-11-05 15:05:10

HNU 13375 Flowery Trails (spfa最短路)的相关文章

HNU 13375 Flowery Trails (最短路)

Flowery Trails Time Limit: 50000ms, Special Time Limit:125000ms, Memory Limit:65536KB Total submit users: 23, Accepted users: 21 Problem 13375 : No special judgement Problem description Input The first line of the input has two integers: P and T. P i

HNU 12847 Dwarf Tower(最短路+队列优化)

题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12847 解题报告:有n样物品,编号从1到n第i样物品可以通过金币vi买到,同时有m种方法,方法的内容是由两种物品可以构造出另一种物品,现在要你求出得到1物品的价值最小是多少? 当成最短路来解,用邻接表存好m种构造方法,然后用队列里面的点去尝试通过构造的方法使得得到i物品所花的价值更小,如果更新成功,再把更新成功的那个点又加入到队列中. 同时要标记一下这个点是不是正在队列

hdu 4568 spfa 最短路算法+旅行商问题

http://acm.hdu.edu.cn/showproblem.php?pid=4568 Problem Description One day, a hunter named James went to a mysterious area to find the treasures. James wanted to research the area and brought all treasures that he could. The area can be represented a

UVALive 6885 Flowery Trails 最短路枚举

题目连接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=129723 题意: 给你一个n点m图的边 1到n有多条最短路,问你所有经过的边的总和*2是多少 题解: 对1,n分别求单源最短路径上spfa 枚举某条边是否为最短上的边 即 边权+disA[i] + disB[i] = 最短路长度,就是答案 #include<bits/stdc++.h> using namespace std; const int N =

poj1502 spfa最短路

1 //Accepted 320 KB 16 ms 2 //有n个顶点,边权用A表示 3 //给出下三角矩阵,求从一号顶点出发到各点的最短路的最大值 4 #include <cstdio> 5 #include <cstring> 6 #include <iostream> 7 #include <queue> 8 #include <cmath> 9 #include <algorithm> 10 using namespace s

SPFA 最短路

GeneralLiu 最短路 什么意思呢 其实就是字面意思喽 解法多样 就只介绍 SPFA 了 每次 用一个 "有意义" 的点 更新与之相连点 的 dis 值 (至于 dis[]数组    dis[i] 表示 源点 到 i 的最短 距离  , dis初始化无穷大) 每次 "有意义" 的更新 就把 被更新点 加入 "有意义点 的 队列" 之中去 (至于 "有意义" 就是 dis 值 变小了,变小了 才有可能 把其他点的 dis

BZOJ 1003 物流运输 (动态规划 SPFA 最短路)

1003: [ZJOI2006]物流运输 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 5590 Solved: 2293 [Submit][Status][Discuss] Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完. 货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线, 以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个 码头会无法装卸货物.这

习题:最短路计数(SPFA最短路计数)

最短路计数(洛谷1144)题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条.输入输出格式输入格式:输入第一行包含2个正整数N,M,为图的顶点数与边数.接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边.输出格式:输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可.如果无法到达顶点i则输出0.输入输出样例输

Marriage Match IV (hdu 3416 网络流+spfa最短路)

Marriage Match IV Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2275    Accepted Submission(s): 691 Problem Description Do not sincere non-interference. Like that show, now starvae also take