鱼C论坛

 找回密码
 立即注册
查看: 3059|回复: 10

一道图的最短路径问题,大佬帮忙看下

[复制链接]
发表于 2020-2-22 17:16:49 | 显示全部楼层 |阅读模式
100鱼币
本帖最后由 798236606 于 2020-2-22 17:20 编辑

题目:https://pintia.cn/problem-sets/9 ... /994805523835109376

之前用迪杰斯特拉算法和BF算法成功通过,但是BF算法的优化算法SPFA算法总是有两个点没通过。
看了一下午了,不知道哪里有问题

C++代码:
  1. #include <cstdio>
  2. #include <climits>
  3. #include <cstring>
  4. #include <vector>
  5. #include <queue>
  6. #include <set>
  7. #include <algorithm>

  8. using namespace std;

  9. const int maxn = 510;

  10. typedef struct node{
  11.     int id, dis;

  12.     node (int _id, int _dis) : id(_id), dis(_dis) {};
  13. }Node;

  14. int n, m, c1, c2;
  15. int weight[maxn];//存放点权,即救援队数
  16. int num[maxn];//存放到每个点的最短路径数
  17. int w[maxn];//存放可聚集的队伍数
  18. int d[maxn];//存放最短路径长度
  19. bool inq[maxn];//是否在队列内
  20. vector<Node> adj[maxn];//邻接表
  21. set<int> pre[maxn];//存放顶点在最短路径中的前驱

  22. void SPFA(int s)
  23. {
  24.     fill(d, d + n, INT_MAX);
  25.     memset(w, 0, sizeof(w));
  26.     memset(num, 0, sizeof(num));
  27.     memset(inq, false, sizeof(inq));

  28.     queue<int> q;
  29.     q.push(s);
  30.     w[s] = weight[s];
  31.     d[s] = 0;
  32.     num[s] = 1;
  33.     inq[s] = true;

  34.     while (!q.empty())
  35.     {
  36.         int u = q.front();
  37.         q.pop();
  38.         inq[u] = false;

  39.         for (int v = 0; v < adj[u].size(); v++)//遍历u连接的每一条边
  40.         {
  41.             int id = adj[u][v].id, dis = adj[u][v].dis;

  42.             if (dis + d[u] < d[id])//如果以u为前驱路径更短
  43.             {
  44.                 d[id] = dis + d[u];
  45.                 num[id] = num[u];
  46.                 w[id] = weight[id] + w[u];
  47.                 pre[id].clear();
  48.                 pre[id].insert(u);

  49.                 if (!inq[id])//如果id不在队列中
  50.                 {
  51.                     q.push(id);
  52.                     inq[id] = true;                    
  53.                 }
  54.             }
  55.             else if (dis + d[u] == d[id])//如果存在等价路径
  56.             {
  57.                 if (weight[id] + w[u] > w[id])
  58.                     w[id] = weight[id] + w[u];

  59.                 num[id] = 0;
  60.                
  61.                 pre[id].insert(u);
  62.                 for (set<int>::iterator it = pre[id].begin(); it != pre[id].end(); ++it)
  63.                     num[id] += num[*it];
  64.             }
  65.         }
  66.     }
  67. }

  68. int main(void)
  69. {
  70.     // freopen("input.txt", "r", stdin);
  71.     scanf("%d %d %d %d", &n, &m, &c1, &c2);

  72.     for (int i = 0; i < n; i++)
  73.         scanf("%d", weight + i);
  74.    
  75.     while (m--)
  76.     {
  77.         int a, b, l;
  78.         scanf("%d %d %d", &a, &b, &l);

  79.         adj[a].push_back(node(b, l));
  80.         adj[b].push_back(node(a, l));
  81.     }

  82.     SPFA(c1);

  83.     printf("%d %d", num[c2], w[c2]);

  84.     return 0;
  85. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-23 18:05:00 | 显示全部楼层
我这里没毛病啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-24 10:11:19 | 显示全部楼层

假的
11.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-24 17:06:13 | 显示全部楼层
我只有前两个数据,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-24 17:06:57 | 显示全部楼层
显示正确
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-25 11:16:28 | 显示全部楼层
蒋博文 发表于 2020-2-24 17:06
我只有前两个数据,

我不信,你肯定打开方式不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 12:13:15 | 显示全部楼层
我好像直接用Dev-c++运行了。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 12:47:38 | 显示全部楼层

骗人:

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 12:48:16 | 显示全部楼层

我都说了,
我好像直接用Dev-c++运行了。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-25 12:48:47 | 显示全部楼层
蒋博文 发表于 2020-2-25 12:48
我都说了,
我好像直接用Dev-c++运行了。。。。

自己看看,别随便诬陷人
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-26 12:47:28 | 显示全部楼层
网站收下了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 20:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表