博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4360 As long as Binbin loves Sangsang spfa
阅读量:7057 次
发布时间:2019-06-28

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

题意:

给定n个点m条边的无向图

每次必须沿着LOVE走,到终点时必须是完整的LOVE,且至少走出一个LOVE,

问这样情况下最短路是多少,在一样短情况下最多的LOVE个数是多少。

有自环。

#include 
#include
#include
#include
#include
#include
using namespace std;typedef __int64 ll;const ll Inf = 4611686018427387904LL;const int N = 1314 + 100;const int E = 13520 * 2 + 100;const int M = N * 4 + 100;struct Edge { ll len; int v, f, nex; Edge() { } Edge(int _v, int _f, ll _len, int _nex) { v = _v; f = _f; len = _len; nex = _nex; }};struct node{ int to, f; node(int b=0,int d=0):to(b),f(d){}};Edge eg[E];ll dis[N][4], tim[N][4];bool vis[N][4];int T, n, g[N], idx;int re(char c) { if (c == 'L') return 0; else if (c == 'O') return 1; else if (c == 'V') return 2; else return 3;}void addedge(int u, int v, ll len, int f) { eg[idx] = Edge(v, f, len, g[u]); g[u] = idx++;}void spfa() { memset(vis, 0, sizeof vis); for (int i = 0; i < n; ++i) for (int j = 0; j < 4; ++j) { dis[i][j] = Inf; tim[i][j] = 0; } queue
q; q.push(node(0,3)); dis[0][3] = 0; tim[0][3] = 0; while(!q.empty()){ node u = q.front(); q.pop(); vis[u.to][u.f] = 0; for(int i = g[u.to]; ~i; i = eg[i].nex){ int y = eg[i].v, f = eg[i].f; if(f != (u.f+1)%4)continue; bool yes = false; if(dis[y][f] > dis[u.to][u.f]+eg[i].len) { dis[y][f] = dis[u.to][u.f]+eg[i].len; tim[y][f] = tim[u.to][u.f]; if(f == 3) tim[y][f]++; yes = true; } else if(dis[y][f] == dis[u.to][u.f]+eg[i].len) { ll tmp = tim[u.to][u.f]; if(f == 3) tmp++; if(tmp > tim[y][f]) tim[y][f] = tmp, yes = true; } else if(tim[y][f]==0) { ll tmp = tim[u.to][u.f]; if(f == 3) tmp++; if(tmp > tim[y][f]) dis[y][f] = dis[u.to][u.f]+eg[i].len, tim[y][f] = tmp, yes = true; } if(yes && vis[y][f] == 0) vis[y][f] = 1, q.push(node(y, f)); } }}void work() { int m, u, v; ll len; char s[5]; memset(g, -1, sizeof g); idx = 0; scanf("%d %d", &n, &m); while (m -- > 0) { scanf("%d%d%I64d%s", &u, &v, &len, s); -- u; -- v; addedge(u, v, len, re(s[0])); addedge(v, u, len, re(s[0])); } spfa(); ll ansdis = dis[n - 1][3], ansnum = tim[n - 1][3]; printf("Case %d: ", ++T); if (ansdis == Inf || ansnum == 0) { puts("Binbin you disappoint Sangsang again, damn it!"); } else {printf("Cute Sangsang, Binbin will come with a donkey after travelling %I64d meters and finding %I64d LOVE strings at last.\n", ansdis, ansnum); }}int main() { int cas; T = 0; scanf("%d", &cas); while (cas -- > 0) work(); return 0;}/*994 41 2 1 L2 4 1 O4 1 1 V1 4 1 E1 41 1 1 L1 1 1 O1 1 1 V1 1 1 E1 0*/

转载地址:http://jtrol.baihongyu.com/

你可能感兴趣的文章
NOIP2003 传染病控制
查看>>
bzoj千题计划316:bzoj3173: [Tjoi2013]最长上升子序列(二分+树状数组)
查看>>
linux: 堆排序和快速排序的整理
查看>>
请求数据传入(SpringMVC)
查看>>
第七篇 PHP编码规范
查看>>
队列(queue)
查看>>
jsHint-静态代码检查工具eclipse中使用
查看>>
xpath节点匹配简易教程
查看>>
undefined reference问题总结
查看>>
binary 和 varbinary
查看>>
php构造方法与析构方法
查看>>
条件熵
查看>>
如何摆脱工具类
查看>>
Eclipse下配置使用Hadoop插件
查看>>
回顾“.NET技术”.NET Remoting分布式开发
查看>>
移动开发多平台代码共享“.NET研究”
查看>>
Convert IPv6 Address to IP numbers (C#)
查看>>
总是弹出visual studio 实时调试器 三种解决办法
查看>>
12岁男孩发现Firefox严重安全漏洞获奖3000美元
查看>>
谷歌发安全警告:社交网络威胁用户隐私
查看>>