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

题意:

有编号为1-N的牛,它们之间存在一些单向的路径。给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求这些牛中所花的最长的来回时间是多少。

思路:

很骚的写法,这里用了两个数组标记,head,next,他每次找到下一个结点后,head就赋给next了,然后head又是一条新的边,这样,我在遍历这个链表的时候,就能从后往前遍历了,我推了一个小时。

然后这里的if语句也很重要,要先松弛,再看前一个结点有没有被访问,没有被访问就加到队列里去,并标记。这里我Debug7小时才发现这个错误。内心是崩溃的。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. #define N 1005
  8. #define M 2000010
  9. #define INF 0x3f3f3f3f
  10.  
  11. int head[M],next[];
  12. int dis[N];
  13. int cnt[N];
  14. bool vis[N];
  15. int n,m,send,x1,y1;
  16. int e;
  17.  
  18. struct Node
  19. {
  20. int u;
  21. int v;
  22. int c;
  23. Node() {}
  24. Node(int u,int v,int c) : u(u),v(v),c(c) {}
  25. } nodes[M];
  26.  
  27. void addNode(int u,int v,int c)
  28. {
  29. nodes[e] = Node(u,v,c);
  30. next[e] = head[u];
  31. head[u] = e++;
  32. }
  33.  
  34. void init()
  35. {
  36. memset(head,-,sizeof(head));
  37. memset(next,-,sizeof(next));
  38.  
  39. memset(cnt,,sizeof(cnt));
  40.  
  41. e = ;
  42. for(int i=; i<m; i++)
  43. {
  44. int u,v,c;
  45. scanf("%d%d%d",&u,&v,&c);
  46. addNode(u,v,c);
  47. //addNode(v,u,c);
  48. }
  49. }
  50.  
  51. bool relax(int u,int v,int c)
  52. {
  53. if(dis[v]>dis[u]+c)
  54. {
  55. dis[v] = dis[u] + c;
  56. return true;
  57. }
  58. return false;
  59. }
  60.  
  61. int spfa(int src,int send)
  62. {
  63. memset(vis,false,sizeof(vis));
  64. for(int i=; i<=n; i++)
  65. dis[i] = INF;
  66.  
  67. dis[src] = ;
  68. vis[src] = true;
  69.  
  70. queue<int> Q;
  71. Q.push(src);
  72. while(Q.size())
  73. {
  74. int f = Q.front();
  75. Q.pop();
  76. vis[f] = false;
  77. for(int i=head[f]; i+; i=next[i])
  78. {
  79. if(relax(f,nodes[i].v,nodes[i].c)&&!vis[nodes[i].v])
  80. {
  81. //if((++cnt[Nodes[i].v]>n)) return -1;
  82. Q.push(nodes[i].v);
  83. vis[nodes[i].v] = true;
  84. }
  85. }
  86. }
  87.  
  88. return dis[send];
  89. }
  90.  
  91. int main()
  92. {
  93.  
  94. scanf("%d%d%d",&n,&m,&send);
  95.  
  96. init();
  97. int tmp = -0x3f3f3f3f;
  98. for(int i=; i<=n; i++)
  99. {
  100.  
  101. if(i==send) continue;
  102. x1 = spfa(i,send);
  103. y1 = spfa(send,i);
  104. if(tmp<(x1+y1))
  105. tmp = x1+y1;
  106. }
  107. printf("%d\n",tmp);
  108.  
  109. return ;
  110. }

Poj(2679),SPFA,邻接表(主流写法)的更多相关文章

  1. poj 1511(SPFA+邻接表)

    题目链接:http://poj.org/problem?id=1511 思路:题目意思很简单就是要求源点到各点的最短路之和,然后再求各点到源点的最短路之和,其实就是建两个图就ok了,其中一个建反图.1 ...

  2. POJ - 3255 SPFA+邻接表求次短路径

    题意:给出m条边 , n个顶点,u [ i ]到v [ i ] 的距离w [ i ],求除了最短路的那条最短的边的长度. 思路:之前有做过相似的题,使用迪杰斯特拉算法求单源最短路径,并且记录路径,枚举 ...

  3. POJ 1511 SPFA+邻接表 Invitation Cards

    题目大意: 计算从 1 点 到 其他所有点的 往返距离之和, 因为是 有向图, 所以我们需要将图反存 一次, 然后求两次单源最短路, 结果就出来了. #include <iostream> ...

  4. SPFA&邻接表 PASCAL

    题目来自CODE[VS]-->热浪 1557 热浪 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石       题目描述 Description 德克萨斯纯朴的民眾们这个 ...

  5. POJ--3268--Silver Cow Party【SPFA+邻接表】

    题意:一些牛要去某一点參加聚会,然后再回到自己家,路是单向的,问花费时间最多的那头牛最少须要花费多长时间. 思路:从聚会地点返回,相当于是从某一点到其它各个点的最短路径.从牛的家中走到聚会地点,能够把 ...

  6. HDU 2544 最短路 SPFA 邻接表 模板

    Problem Description 在每年的校赛里,全部进入决赛的同学都会获得一件非常美丽的t-shirt.可是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以如今他们想 ...

  7. 【算法系列学习】SPFA邻接表最短路 [kuangbin带你飞]专题四 最短路练习 F - Wormholes

    https://vjudge.net/contest/66569#problem/F 题意:判断图中是否存在负权回路 首先,介绍图的邻接表存储方式 数据结构:图的存储结构之邻接表 邻接表建图,类似于头 ...

  8. HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. POJ 1511 Invitation Cards(Dijkstra(优先队列)+SPFA(邻接表优化))

    题目链接:http://poj.org/problem?id=1511 题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9.问你从起点到各个点以及从各个 ...

随机推荐

  1. 3D照片放大展示窗口

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  2. spring 官方下载地址

    SPRING官方网站改版后,建议都是通过Maven和Gradle下载,对不使用Maven和Gradle开发项目的,下载就非常麻烦. 下给出Spring Framework jar官方直接下载路径: h ...

  3. fzu 2188 过河I

    http://acm.fzu.edu.cn/problem.php?pid=2188 过河I Time Limit:3000MS     Memory Limit:32768KB     64bit ...

  4. UML: 状态机图

    摘自http://www.umlonline.org/school/viewthread.php?tid=39 活动图将流程分解为一个一个的活动,通过活动的先后顺序来展示流程:而状态机图从某个物品的状 ...

  5. linux第12天 线程

    今天主要学习了共享内存,信号量的封装,还有线程. POSIX线程库 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的 要使用这些函数库,要通过引入头文<p ...

  6. 常见http状态

    200(成功):服务器已成功处理了请求.通常,这表示服务器提供了请求的网页.如果是对您的 robots.txt 文件显示此状态码,则表示 Googlebot 已成功检索到该文件. 304(未修改):自 ...

  7. Oracle游标总结

    1.声明游标 declare teacher_id ); teacher_name ); teacher_title ); teacher_sex ); cursor teacher_cur is ; ...

  8. Deep Learning 深度学习 学习教程网站集锦(转)

    http://blog.sciencenet.cn/blog-517721-852551.html 学习笔记:深度学习是机器学习的突破 2006-2007年,加拿大多伦多大学教授.机器学习领域的泰斗G ...

  9. iOS的第一个习作

    首发:个人博客,更新&纠错&回复 代码在这里,对git还是使用不熟练,好在github新建项目后体贴地提示是不是要执行这样两句—— 这两句我肯定是背不住的,所以记一下. git rem ...

  10. C#制作Windows service服务系列二:演示一个定期执行的windows服务及调试(windows service)

    系列一: 制作一个可安装.可启动.可停止.可卸载的Windows service(downmoon原创) 系列二:演示一个定期执行的windows服务及调试(windows service)(down ...