题目链接:http://poj.org/problem?id=1511

题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9。问你从起点到各个点以及从各个点到起点的最小路程总和。

解题思路:这里用了优先队列优化的dijkstra复杂度mlogn,从起点到个点最短路径直接算就好了,算各个点到起点的最短路径,只要把边的方向反一下,再算一次从起点到个点最短路径就好了。

Dijkstra:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<functional>
  5. #include<vector>
  6. #include<queue>
  7. using namespace std;
  8. typedef long long LL;
  9. typedef pair<int,int> p;
  10. const int N=1e6+;
  11. const int INF=<<;//这里不能比1e9小
  12. struct edge{
  13. int to,cost;
  14. };
  15.  
  16. vector<edge>eg[N];
  17. int V,E;
  18. bool used[N];
  19. int d[N];
  20. int a[N],b[N],c[N];
  21.  
  22. void dijkstra(int s){
  23. for(int i=;i<=V;i++){
  24. d[i]=INF;
  25. used[i]=false;
  26. }
  27. d[s]=;
  28.  
  29. priority_queue<p,vector<p>,greater<p> >q;
  30. q.push(p(,s));
  31. while(!q.empty()){
  32. p p1=q.top();
  33. q.pop();
  34. int v=p1.second;
  35. if(used[v]) continue;
  36. used[v]=true;
  37. for(int i=;i<eg[v].size();i++){
  38. edge e=eg[v][i];
  39. if(d[e.to]>d[v]+e.cost){
  40. d[e.to]=d[v]+e.cost;
  41. q.push(p(d[e.to],e.to));
  42. }
  43. }
  44. }
  45. }
  46.  
  47. int main(){
  48. int q;
  49. scanf("%d",&q);
  50. while(q--){
  51. scanf("%d %d",&V,&E);
  52. for(int i=;i<=V;i++){
  53. eg[i].clear();
  54. }
  55. for(int i=;i<=E;i++){
  56. scanf("%d%d%d",&a[i],&b[i],&c[i]);
  57. edge gg;
  58. gg.to=b[i],gg.cost=c[i];
  59. eg[a[i]].push_back(gg);
  60. }
  61. dijkstra();
  62. LL sum=;
  63. for(int i=;i<=V;i++){
  64. sum+=d[i];
  65. }
  66. //将边的方向反一下
  67. for(int i=;i<=V;i++){
  68. eg[i].clear();
  69. }
  70. for(int i=;i<=E;i++){
  71. edge gg;
  72. gg.to=a[i],gg.cost=c[i];
  73. eg[b[i]].push_back(gg);
  74. }
  75. dijkstra();
  76. for(int i=;i<=V;i++){
  77. sum+=d[i];
  78. }
  79. printf("%lld\n",sum);
  80. }
  81. }

SPFA:

  1. #include<iostream>
  2. #include<queue>
  3. #include<vector>
  4. using namespace std;
  5. const int INF=<<;
  6. const int N=1e6+;
  7.  
  8. struct edge{
  9. int to,cost;
  10. };
  11.  
  12. vector<edge>eg[N];
  13. int V,E;
  14. bool used[N];//是否在队列中
  15. int d[N];
  16. int a[N],b[N],c[N];
  17.  
  18. void spfa(int s){
  19. for(int i=;i<=V;i++){
  20. d[i]=INF;
  21. used[i]=false;
  22. }
  23. d[s]=;
  24.  
  25. queue<int>q;
  26. q.push(s);
  27. used[s]=true;
  28. while(!q.empty()){
  29. int v=q.front();
  30. q.pop();
  31. used[v]=false;
  32. for(int i=;i<eg[v].size();i++){
  33. edge e=eg[v][i];
  34. if(d[e.to]>d[v]+e.cost){
  35. d[e.to]=d[v]+e.cost;
  36. if(!used[e.to]){
  37. used[e.to]=true;
  38. q.push(e.to);
  39. }
  40. }
  41. }
  42. }
  43. }
  44.  
  45. int main(){
  46. int q;
  47. scanf("%d",&q);
  48. while(q--){
  49. scanf("%d%d",&V,&E);
  50. for(int i=;i<=V;i++){
  51. eg[i].clear();
  52. }
  53. for(int i=;i<=E;i++){
  54. scanf("%d%d%d",&a[i],&b[i],&c[i]);
  55. edge gg;
  56. gg.to=b[i],gg.cost=c[i];
  57. eg[a[i]].push_back(gg);
  58. }
  59. spfa();
  60. long long sum=;
  61. for(int i=;i<=V;i++){
  62. sum+=d[i];
  63. }
  64. //方向反一下
  65. for(int i=;i<=V;i++){
  66. eg[i].clear();
  67. }
  68. for(int i=;i<=E;i++){
  69. edge gg;
  70. gg.to=a[i],gg.cost=c[i];
  71. eg[b[i]].push_back(gg);
  72. }
  73. spfa();
  74. for(int i=;i<=V;i++){
  75. sum+=d[i];
  76. }
  77. printf("%lld\n",sum);
  78. }
  79. }

POJ 1511 Invitation Cards(Dijkstra(优先队列)+SPFA(邻接表优化))的更多相关文章

  1. POJ 1511 - Invitation Cards (dijkstra优先队列)

    题目链接:http://poj.org/problem?id=1511 就是求从起点到其他点的最短距离加上其他点到起点的最短距离的和 , 注意路是单向的. 因为点和边很多, 所以用dijkstra优先 ...

  2. POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / SCU 1132 Invitation Cards / ZOJ 2008 Invitation Cards / HDU 1535 (图论,最短路径)

    POJ 1511 Invitation Cards / UVA 721 Invitation Cards / SPOJ Invitation / UVAlive Invitation Cards / ...

  3. POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)

    Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 16178   Accepted: 526 ...

  4. POJ 1511 Invitation Cards (spfa的邻接表)

    Invitation Cards Time Limit : 16000/8000ms (Java/Other)   Memory Limit : 524288/262144K (Java/Other) ...

  5. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

  6. DIjkstra(反向边) POJ 3268 Silver Cow Party || POJ 1511 Invitation Cards

    题目传送门 1 2 题意:有向图,所有点先走到x点,在从x点返回,问其中最大的某点最短路程 分析:对图正反都跑一次最短路,开两个数组记录x到其余点的距离,这样就能求出来的最短路以及回去的最短路. PO ...

  7. Poj 1511 Invitation Cards(spfa)

    Invitation Cards Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 24460 Accepted: 8091 De ...

  8. SPFA算法(2) POJ 1511 Invitation Cards

    原题: Invitation Cards Time Limit: 8000MS   Memory Limit: 262144K Total Submissions: 31230   Accepted: ...

  9. poj 1511 Invitation Cards spfa 邻接矩阵

    题目链接: http://poj.org/problem?id=1511 题目大意: 这道题目比较难理解,我读了好长时间,最后还是在队友的帮助下理解了题意,大意就是,以一为起点,求从一到其他各点的最短 ...

随机推荐

  1. Spring中使用要点集合

    1.InitializingBean和init-method方法 Spring的InitializingBean为bean提供了定义初始化方法的方式.InitializingBean是一个接口,它仅仅 ...

  2. 【JQuery】css操作

    一.前言         接着上一章的内容,继续JQuery的学习 二.内容 css 设置或返回匹配元素的样式属性 $(selector).css(css-property-name) $(selec ...

  3. 光荣之路测试开发面试linux考题之四:性能命令

    Hi,大家好我是tom,I am back.今天要给大家讲讲linux系统一些性能相关命令. 1.fdisk 磁盘管理 是一个强大的危险命令,所有涉及磁盘的操作都由该命令完成,包括:新增磁盘.增删改磁 ...

  4. Splay 的区间操作

    学完Splay的查找作用,发现和普通的二叉查找树没什么区别,只是用了splay操作节省了时间开支. 而Splay序列之王的称号可不是白给的. Splay真正强大的地方是他的区间操作. 怎么实现呢? 我 ...

  5. Linux之Libcurl库的介绍与应用20170509

    一.LibCurl简介 LibCurl是免费的客户端URL传输库,支持FTP,FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE ,LDAP等 ...

  6. javaWeb中,文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  7. 04-树5. File Transfer--并查集

    对于一个集合常见的操作有:判断一个元素是否属于一个集合:合并两个集合等等.而并查集是处理一些不相交集合(Disjoint Sets)的合并及查询问题的有利工具. 并查集是利用树结构实现的.一个集合用一 ...

  8. phpmyadmin 登录时间修改

    登录后1440秒未活动后总是自动退出,一天还要登录多次,终于有时间来解决这个问题了,感觉是session超时,结果在网上search了下,找到解决办法啦,哈哈哈,在此做个笔记:phpmyadmin在使 ...

  9. linux中使用随机数

    (1)单纯使用rand重复调用n次,就会得到一个0-RAND_MAX之间的伪随机数,如果需要调整范围,可以得到随机数序列后再进行计算.(2)单纯使用rand来得到伪随机数序列有缺陷,每次执行程序得到的 ...

  10. (转)select、poll、epoll之间的区别

    本文来自:https://www.cnblogs.com/aspirant/p/9166944.html (1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道 ...