【最短路-spfa算法】Road Construction Aizu - 2249

比眉伴天荒 2022-05-31 01:42 274阅读 0赞

Think:
1知识点:最短路-spfa算法
2题意:n个城市m条路,每条路的信息包括起点(u)、终点(v)、长度(d)、花费(c),询问在保证1号城市到其它城市距离最短的条件下,连通n个城市的最少花费。
2.1数据范围:
1 <= n <= 1e4
0 <= m <= 2e4
1 <= d <= 1000
1 <= c <= 1000
3错误反思:
3.1:spfa算法求最短路中,手动模拟队列时注意如果不是用循环队列需要注意队列的大小(因为虽然在某一时刻队列中不会出现重复的元素,但某一元素可能会多次入队更新最短路)

vjudge题目链接

以下为Accepted代码——循环队列

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int inf = 0x3f3f3f3f;
  6. const int N = 10414;
  7. const int M = 40414;
  8. struct Edge{
  9. int u, v, d, c;
  10. int next;
  11. }edge[M];
  12. int cnt, head[N];
  13. int vis[N], dis[N], cost[N];
  14. int op, tp, link[N];
  15. void add_edge(int u, int v, int d, int c);
  16. void spfa(int n);
  17. int main(){
  18. int n, m, i, u, v, d, c;
  19. while(~scanf("%d %d", &n, &m) && (n || m)){
  20. cnt = 0;
  21. memset(head, -1, sizeof(head));
  22. for(i = 0; i < m; i++){
  23. scanf("%d %d %d %d", &u, &v, &d, &c);
  24. add_edge(u, v, d, c);
  25. add_edge(v, u, d, c);
  26. }
  27. spfa(n);
  28. }
  29. return 0;
  30. }
  31. void add_edge(int u, int v, int d, int c){
  32. edge[cnt].u = u;
  33. edge[cnt].v = v;
  34. edge[cnt].d = d;
  35. edge[cnt].c = c;
  36. edge[cnt].next = head[u];
  37. head[u] = cnt++;
  38. return;
  39. }
  40. void spfa(int n){
  41. int i, u, v, d, c, sum;
  42. memset(vis, 0, sizeof(vis));
  43. memset(dis, inf, sizeof(dis));
  44. memset(cost, inf, sizeof(cost));
  45. op = tp = 0;
  46. vis[1] = 1, dis[1] = 0, cost[1] = 0;
  47. link[tp++] = 1;
  48. while(true){
  49. op %= N;
  50. tp %= N;
  51. if(op == tp) break;
  52. u = link[op++];
  53. vis[u] = 0;
  54. for(i = head[u]; ~i; i = edge[i].next){
  55. v = edge[i].v, d = edge[i].d, c = edge[i].c;
  56. if(dis[v] > dis[u] + d || (dis[v] == dis[u] + d && cost[v] > c)){
  57. dis[v] = dis[u] + d;
  58. cost[v] = c;
  59. if(!vis[v]){
  60. vis[v] = 1;
  61. link[tp++] = v;
  62. }
  63. }
  64. }
  65. }
  66. sum = 0;
  67. for(i = 1; i <= n; i++){
  68. sum += cost[i];
  69. }
  70. printf("%d\n", sum);
  71. return;
  72. }

发表评论

表情:
评论列表 (有 0 条评论,274人围观)

还没有评论,来说两句吧...

相关阅读

    相关 短路Spfa

    问题描述 给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。 输入格式 第一行两个整数n,