节点不可重复经过的K短路问题。

思路:二分路径长度,深搜小于等于路径长度的路径数。可以利用可重复点K短路问题中的A*函数进行剪枝。

尝试另一种解法:把可重复点K短路A*直接搬过来,堆中的每个元素额外记录之前走过的所有点。这样就可以据此防止走重复的点。最大100个点,可用两个长整形状态压缩。

一直PE,无法验证效率。

  1. #include <map>
  2. #include <set>
  3. #include <list>
  4. #include <queue>
  5. #include <stack>
  6. #include <cmath>
  7. #include <vector>
  8. #include <cstdio>
  9. #include <string>
  10. #include <cstring>
  11. #include <cstdlib>
  12. #include <iostream>
  13. #include <algorithm>
  14. using namespace std;
  15. typedef long long ll;
  16.  
  17. #define eps 1e-8
  18. #define inf 0x7f3f3f3f
  19. #define debug puts("BUG")
  20. #define read freopen("in.txt","r",stdin)
  21.  
  22. #define N 111
  23. #define M 11111
  24. struct node
  25. {
  26. int v,w,n;
  27. }ed[M],ed2[M];
  28. int head[N],head2[N],cnt,cnt2;
  29. struct str
  30. {
  31. int v,p;
  32. }st[M*];
  33. struct node2
  34. {
  35. int v,g,f,dx;
  36. ll m1,m2;
  37. void set(int _v,int _g,int _f,int dx,ll m1,ll m2)
  38. {
  39. this->v = _v;
  40. this->g = _g;
  41. this->f = _f;
  42. this->dx = dx;
  43. this->m1 = m1;
  44. this->m2 = m2;
  45. }
  46. bool operator < (const node2 &n) const
  47. {
  48. if (n.f == f) return n.g < g;
  49. return n.f < f;
  50. }
  51. };
  52. void sc(int s,ll &m1,ll &m2)
  53. {
  54. if (s>) m2 |= ((s-)<<);
  55. else m1 |= ((s-)<<);
  56. }
  57. bool ck(int s,ll m1,ll m2)
  58. {
  59. if (s>) return (m2&((s-)<<)) != ;
  60. else return (m1&((s-)<<)) != ;
  61. }
  62. void init()
  63. {
  64. memset(head,-,sizeof(head));
  65. memset(head2,-,sizeof(head2));
  66. cnt = cnt2 = ;
  67. }
  68. void add(int u,int v,int w)
  69. {
  70. ed[cnt].v = v;
  71. ed[cnt].w = w;
  72. ed[cnt].n = head[u];
  73. head[u] = cnt++;
  74. ed2[cnt2].v = u;
  75. ed2[cnt2].w = w;
  76. ed2[cnt2].n = head2[v];
  77. head2[v] = cnt2++;
  78. }
  79. int h[N];
  80. bool vis[N];
  81. void spfa(int s,int n)
  82. {
  83. queue<int>q;
  84. memset(vis,,sizeof(vis));
  85. for (int i = ; i <= n; ++i)
  86. h[i] = inf;
  87. q.push(s);
  88. h[s] = ;
  89. vis[s] = true;
  90. while (!q.empty())
  91. {
  92. int u = q.front();
  93. q.pop();
  94. vis[u] = false;
  95. for (int i=head2[u];~i;i=ed2[i].n)
  96. {
  97. int v = ed2[i].v,w = ed2[i].w;
  98. if (h[v]>h[u]+w)
  99. {
  100. h[v] = h[u] + w;
  101. if (!vis[v])
  102. {
  103. vis[v] = true;
  104. q.push(v);
  105. }
  106. }
  107. }
  108. }
  109. }
  110. int ans[N];
  111. void astar(int s,int t,int k)
  112. {
  113. priority_queue<node2> q;
  114. int cnt = , dx = ;
  115. node2 n,n2;
  116. ll m1=,m2=;
  117. sc(s,m1,m2);
  118. st[dx].p = -,st[dx].v = s;
  119. n.set(s,,h[s],dx++,m1,m2);
  120. q.push(n);
  121. while (!q.empty())
  122. {
  123. n = q.top();
  124. q.pop();
  125. if (n.v == t) cnt++;
  126. if (cnt == k)
  127. {
  128. int a = n.dx, b = ;
  129. while (~a)
  130. {
  131. ans[b++] = st[a].v;
  132. a = st[a].p;
  133. }
  134. printf("%d %d\n",n.g,b);
  135. bool ff = false;
  136. for (int i = b-; i >= ; --i)
  137. {
  138. if (ff) printf(" ");
  139. else ff = true;
  140. printf("%d",ans[i]);
  141. }puts("");
  142. return ;
  143. }
  144. for (int i=head[n.v];~i;i=ed[i].n)
  145. {
  146. int v = ed[i].v, w = ed[i].w;
  147. m1 = n.m1, m2 = n.m2;
  148. if (ck(v,m1,m2)) continue;
  149. sc(v,m1,m2);
  150. st[dx].p = n.dx, st[dx].v = v;
  151. n2.set(v,n.g+w,n.g+w+h[v],dx++,m1,m2);
  152. q.push(n2);
  153. }
  154. }
  155. return ;
  156. }
  157. int main()
  158. {
  159. //read;
  160. int n,m,k;
  161. while (~scanf("%d%d%d",&n,&m,&k))
  162. {
  163. init();
  164. int u,v,w,s,t;
  165. for (int i = ; i < m; ++i)
  166. {
  167. scanf("%d%d%d",&u,&v,&w);
  168. add(u,v,w);
  169. }
  170. scanf("%d%d",&s,&t);
  171. spfa(t,n);
  172. astar(s,t,k);
  173. }
  174. return ;
  175. }

SGU 145的更多相关文章

  1. SGU 145.Strange People(无环K短路)

    时间:0.25s空间:4m 题意: 其实就是求无环第K短路. 输入: 给出n,m,k,分别代表,n个点,m条边,第k长路. 接下来m行,三个整数x,y,z,分别代表x,y之间有条费用为x的双向路.保证 ...

  2. SGU 分类

    http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...

  3. SGU 495. Kids and Prizes

    水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...

  4. ACM: SGU 101 Domino- 欧拉回路-并查集

    sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Desc ...

  5. 【SGU】495. Kids and Prizes

    http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:N个箱子M个人,初始N个箱子都有一个礼物,M个人依次等概率取一个箱子,如果有礼物则 ...

  6. SGU 455 Sequence analysis(Cycle detection,floyd判圈算法)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=455 Due to the slow 'mod' and 'div' operati ...

  7. SGU 422 Fast Typing(概率DP)

    题目大意 某人在打字机上打一个字符串,给出了他打每个字符出错的概率 q[i]. 打一个字符需要单位1的时间,删除一个字符也需要单位1的时间.在任意时刻,他可以花 t 的时间检查整个打出来的字符串,并且 ...

  8. sgu 104 Little shop of flowers 解题报告及测试数据

    104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB 问题: 你想要将你的 ...

  9. 树形DP求树的重心 --SGU 134

    令一个点的属性值为:去除这个点以及与这个点相连的所有边后得到的连通分量的节点数的最大值. 则树的重心定义为:一个点,这个点的属性值在所有点中是最小的. SGU 134 即要找出所有的重心,并且找出重心 ...

随机推荐

  1. tomcat无法正确解析请求参数

    24-Mar-2018 14:11:20.564 INFO [http-nio-8080-exec-3] org.apache.coyote.http11.Http11Processor.servic ...

  2. linux arping-通过发送ARP协议报文测试网络

    博主推荐:更多网络测试相关命令关注 网络测试  收藏linux命令大全 arping命令是用于发送arp请求到一个相邻主机的工具,arping使用arp数据包,通过ping命令检查设备上的硬件地址.能 ...

  3. 树莓派-3 启用root

    默认是user: pi,  password: raspberry 通过如下设置root密码并启用 pi@raspberrypi:~ $ sudo passwd root Enter new UNIX ...

  4. 77-CCI,Commodity Channel Index,商品通道指标.(2015.7.1)

    CCI,Commodity Channel Index 商品通道指标 Channel Index,商品通道指标.(2015.7.1)" title="77-CCI,Commodit ...

  5. ECNU 3263 丽娃河的狼人传说 (贪心)

    链接:http://acm.ecnu.edu.cn/problem/3263/ 题意: 从 1 到 n 的一条数轴.有 m 个区间至少要安装一定数量的路灯,路灯只能装在整数点上,有k盏路灯已经安装好  ...

  6. 乱记结论之OI常用四大数列

    一.斐波那契数列 $f(0)=1,f(1)=1,f(i)=f(i-1)+f(i-2) \ \ \ \ (i>=2)$ 经典的解释是兔子生小孩,第0年一对兔子,一对兔子需要一年长大,后面每年都生小 ...

  7. 【http_load】http_load性能测试工具使用详解

    1.什么是http_loadhttp_load是一款基于Linux平台的web服务器性能测试工具,用于测试web服务器的吞吐量与负载,web页面的性能. 2.http_load的安装1)下载地址wge ...

  8. SOJ 4454 (矩阵快速幂)

    先引入数的快速幂 例如计算2的5次方,常规算法2*2*2*2*2,利用快速幂的思想,求出5的二进制表达式101,权值为1和4的位上数字为1,即2^5=2^1*2^4.代码如下,时间复杂度为O(logn ...

  9. 洛谷——P3379 【模板】最近公共祖先(LCA)

    P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...

  10. Ubuntu 16.04安装ntopng流量监控软件

    ntop官方在2012年就已经不再更新,取代的是ntopng.ntopng具有Web页面,适合做网络管理监控软件.比如监控局域网内多台机器的上网情况等. 不过这个东西感觉不太准,最好的方案应该把安装n ...