博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SPFA/Dijkstra POJ 3013 Big Christmas Tree
阅读量:6037 次
发布时间:2019-06-20

本文共 2140 字,大约阅读时间需要 7 分钟。

 

题意:找一棵树使得造价最少,造价为每个点的子节点造价和*边的造价和

分析:最短路跑出1根节点到每个点的最短边权值,然后每个点的权值*最短边距和就是答案,注意INF开足够大,n<=1特判。Dijkstra 和 SPFA都行

 

代码:

#include 
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int N = 5e4 + 10;const ll INF = (1ll << 16) * 50000;struct Edge { int v, w, nex; Edge (int _v = 0, int _w = 0) : v (_v), w (_w) {} bool operator < (const Edge &r) const { return w > r.w; }}edge[N*2];ll d[N];bool vis[N];int head[N];int c[N];int cnt[N];int n, m, e;void init(void) { memset (head, -1, sizeof (head)); e = 0;}bool SPFA(int s) { queue
Q; memset (vis, false, sizeof (vis)); memset (cnt, 0, sizeof (cnt)); d[s] = 0; cnt[s] = 1; vis[s] = true; Q.push (s); while (!Q.empty ()) { int u = Q.front (); Q.pop (); vis[u] = false; for (int i=head[u]; ~i; i=edge[i].nex) { int v = edge[i].v, w = edge[i].w; if (d[v] > d[u] + w) { d[v] = d[u] + w; if (!vis[v]) { vis[v] = true; Q.push (v); if (++cnt[v] > n) return true; } } } } return false;}void Dijkstra(int s) { priority_queue
Q; memset (vis, false, sizeof (vis)); d[s] = 0; Q.push (Edge (s, 0)); while (!Q.empty ()) { int u = Q.top ().v; Q.pop (); vis[u] = true; for (int i=head[u]; ~i; i=edge[i].nex) { int v = edge[i].v, w = edge[i].w; if (!vis[v] && d[v] > d[u] + w) { d[v] = d[u] + w; Q.push (Edge (v, d[v])); } } }}void add_edge(int u, int v, int w) { edge[e].v = v, edge[e].w = w; edge[e].nex = head[u]; head[u] = e++;}int main(void) { int T; scanf ("%d", &T); while (T--) { scanf ("%d%d", &n, &m); for (int i=1; i<=n; ++i) { scanf ("%d", &c[i]); d[i] = INF; } init (); for (int u, v, w, i=1; i<=m; ++i) { scanf ("%d%d%d", &u, &v, &w); add_edge (u, v, w); add_edge (v, u, w); } if (n <= 1) { puts ("0"); continue; } Dijkstra (1); // bool flag = SPFA (1); // if (flag) { // puts ("No Answer"); continue; // } ll ans = 0; for (int i=1; i<=n; ++i) { if (d[i] == INF) { ans = -1; break; } ans += d[i] * c[i]; } if (ans == -1) puts ("No Answer"); else printf ("%I64d\n", ans); } return 0;}

  

转载于:https://www.cnblogs.com/Running-Time/p/4776613.html

你可能感兴趣的文章
Spring Security4实战与原理分析视频课程( 扩展+自定义)
查看>>
第一周博客作业
查看>>
thinkpython2
查看>>
oracle recyclebin与flashback drop
查看>>
svmlight使用说明
查看>>
Swing 和AWT之间的关系
查看>>
Mysql设置自增长主键的初始值
查看>>
Android计时器正确应用方式解析
查看>>
获取post传输参数
查看>>
ASP生成静态页面的方法
查看>>
HDU 1325 Is It A Tree? 判断是否为一棵树
查看>>
Shell命令-文件压缩解压缩之gzip、zip
查看>>
个人总结
查看>>
uva 673 Parentheses Balance
查看>>
Bzoj 2252: [2010Beijing wc]矩阵距离 广搜
查看>>
css 禁止选中文本
查看>>
bzoj2165
查看>>
算术运算表达式正则及分析
查看>>
Oracle 12c 多租户 手工创建 pdb 与 手工删除 pdb
查看>>
shell初涉
查看>>