题意:

给一个无向图,总共有 n个点,m+k条边,给定点所连的k条边可以选择删除

问最多删除多少条可以保持该定点到其他点的最短路不变

题解:

从定点出发做单元最短路

首先如果定点到某个点的最短路小于 可删边的长度,则肯定可以删除

此外如果最短路与可删边长度相等,而且最短路条数大于1,肯定也可以删除

所以在做最短路的时候需要记录一下条数

//同时还会有重边,也要注意处理

ps...这题sxbk的把普通的spfa 都卡了。。加了slf优化才过,据说dij可以轻松过。。不过我没试2333

以后写spfa还是都写deque版的吧= =!

代码:

  1. #include <stdio.h>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <queue>
  6. using namespace std;
  7. const int inf =;
  8. struct edge
  9. {
  10. int from,to,w,next;
  11. }e[];
  12. int head[];
  13. int vis[];
  14. int dist[];
  15. int vi[];
  16. int hs[];
  17. int n,m,t;
  18. void add(int i,int j,int w)
  19. {
  20. e[t].from=i;
  21. e[t].to=j;
  22. e[t].w=w;
  23. e[t].next=head[i];
  24. head[i]=t++;
  25. return ;
  26. }
  27. void spfa(int s)
  28. {
  29. deque <int> q;
  30. for(int i=;i<=n;i++)
  31. dist[i]=inf;
  32. memset(vis,false,sizeof(vis));
  33. q.push_back(s);
  34. dist[s]=;
  35. while(!q.empty())
  36. {
  37. int u=q.front();
  38. q.pop_front();
  39. vis[u]=false;
  40. for(int i=head[u];i!=-;i=e[i].next)
  41. {
  42.  
  43. int v=e[i].to;
  44. if(dist[v]>=dist[u]+e[i].w)
  45. {
  46. dist[v]=dist[u]+e[i].w;
  47. if(dist[v]==hs[v])
  48. vi[v]++;
  49. else if(dist[v]<hs[v])
  50. vi[v]=;
  51. if(!vis[v])
  52. {
  53. vis[v]=true;
  54. if(!q.empty()&&dist[v]<dist[q.front()]) //spfa的slf优化
  55. q.push_front(v);
  56. else
  57. q.push_back(v);
  58. }
  59. }
  60. }
  61. }
  62. }
  63. int main()
  64. {
  65. int a,b,c,k;
  66. scanf("%d%d%d",&n,&m,&k);
  67. t=;
  68. memset(head,-,sizeof(head));
  69. while(m--)
  70. {
  71. scanf("%d%d%d",&a,&b,&c);
  72. add(a,b,c);
  73. add(b,a,c);
  74. }
  75. int ans=;
  76. while(k--)
  77. {
  78. scanf("%d%d",&b,&c);
  79. if(hs[b]==)
  80. {
  81. hs[b]=c;
  82. add(,b,c);
  83. add(b,,c);
  84. }
  85. else //处理重边
  86. {
  87. ans++;
  88. if(c<hs[b])
  89. {
  90. hs[b]=c;
  91. add(,b,c);
  92. add(b,,c);
  93. }
  94. }
  95. }
  96. spfa();
  97. for(int i=;i<=n;i++)
  98. {
  99. if(vi[i]>)
  100. ans++;
  101. }
  102. printf("%d\n",ans);
  103. return ;
  104. }

codeforces257 div2 D最短路条数的更多相关文章

  1. 紧急救援 L2-001 dijkstra 打印路径 最短路条数 权值

    较为复杂的dijkstra 包含路径打印  最小路的条数  最小路径的情况下取最大权值 v0要是标记就会出错...? 有权值的题目  不能设置mp[i][i]为0  否则会无限加权 这题很有参考价值 ...

  2. 关于 最短路条数 和 边不可重复最短路条数问题 /hdu3599(边不可重复最短路)

    原先一直在做一道省赛题,由于题意错误理解成球最短路条数,误打误撞敲了最短路条数,又发现hdu3599(多校)求边不可重复最短路条数.下面说说俩种问题解法: 最短路条数: 求一个图一共一几条最短路径,思 ...

  3. HDU 1142 A Walk Through the Forest (求最短路条数)

    A Walk Through the Forest 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1142 Description Jimmy exp ...

  4. UVA - 12295 最短路(迪杰斯特拉)——求按对称路线最短路条数

    题意: 给你一个n,然后给你一个n*n的正方形w[i][j],你需要找到一个从(1,1)点走到(n,n)点的最短路径数量.而且这个路径必须按照y=x对称 题解: 我们把左上角的点当作(0,0)点,右下 ...

  5. POJ 3463 最(次)短路条数

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9497   Accepted: 3340 Descr ...

  6. hdu3191+hdu1688(求最短路和次短路条数,模板)

    hdu3191题意:求出次短路的长度和条数 #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  7. POJ 3463 Sightseeing (次短路经数)

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions:10005   Accepted: 3523 Descr ...

  8. HDU 3191 次短路长度和条数

    http://www.cnblogs.com/wally/archive/2013/04/16/3024490.html http://blog.csdn.net/me4546/article/det ...

  9. HDU 1688 Sightseeing 【输出最短路+次短路条数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题目大意:给n个点,m条有向边.再给出起点s, 终点t.求出s到t的最短路条数+次短路条数. 思 ...

随机推荐

  1. C#中hashtable的赋值、取值、遍历、排序操作

    一,哈希表(Hashtable)简述 在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其 ...

  2. Java基础知识强化30:String类之String的特点(String为什么是final)

    1. String字符串特点: 一旦被赋值,字符串值就不能改变. 这里String是final修饰的,具有不可继承性. 2. 为什么String是final? 主要是为了"效率"  ...

  3. LSI SAS 2208 配置操作

    配置LSISAS2208 介绍LSISAS2208扣卡的配置方法. 2.1 登录CU界面 介绍登录LSISAS2208的CU配置界面的方法,以及CU界面的主要功能. 2.2 创建RAID 介绍创建RA ...

  4. Linux 系统运行级别

    Linux运行级别从0-6,共7个.  0:关机.不能将系统缺省运行级别设置为0,否则无法启动.  1:单用户模式,只允许root用户对系统进行维护.  2:多用户模式,但不能使用NFS(相当于Win ...

  5. TreeView绑定无限层级关系类

    protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { Bind_TV(TreeView1.Nodes); ...

  6. poj 1595

    #include <iostream> #define N 10010 using namespace std; int a[N],b[N]; int prime(int a) { int ...

  7. 简单水池&&迷宫问题

    #include <iostream> #include <stdio.h> #include <cstring> using namespace std; int ...

  8. SQL Server 分组后取Top N

    SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿 ...

  9. preventDefault() 方法 取消掉与事件关联的默认动作

    前几天写的 响应键盘的图片切换 中, 键盘总是让浏览器滚动,为了取消掉默认的事件,使用了 preventDefault() 方法 定义和用法 preventDefault() 方法取消事件的默认动作. ...

  10. XML Schema (1)

    XML Schema 是基于 XML 的 DTD 替代者. XML Schema 描述 XML 文档的结构. XML Schema 语言也称作 XML Schema 定义(XML Schema Def ...