文章

4

粉丝

0

获赞

13

访问

338

头像
P1286 最短路径 部分样例未通过,不知道为什么
P1286 上海交通大学机试题
发布于2025年3月10日 16:46
阅读数 55

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n,m;
  4. struct edge
  5. {
  6. int u;
  7. int v;
  8. int w;
  9. };
  10. vector<edge>edges;
  11. vector<int>G[100];
  12. int dis[100];
  13. int vis[100];
  14. void init()
  15. {
  16. for(int i=0;i<n;i++)
  17. {
  18. G[i].clear();
  19. }
  20. edges.clear();
  21. memset(dis,0x3f3f3f3f,sizeof(dis));
  22. memset(vis,0,sizeof(vis));
  23. }
  24. void adde(int u,int v,int w)
  25. {
  26. edges.push_back(edge{u,v,w});
  27. int sz=edges.size()-1;
  28. G[u].push_back(sz);
  29. }
  30. int getlong(int k)
  31. {
  32. int ans=1;
  33. while(k--)
  34. {
  35. ans=ans*2%100000;
  36. }
  37. return ans;
  38. }
  39. void spfa(int s)
  40. {
  41. dis[s]=0;
  42. vis[s]=1;
  43. queue<int>q;
  44. q.push(s);
  45. while(!q.empty())
  46. {
  47. int u=q.front();q.pop();
  48. vis[u]=0;
  49. for(unsigned int i=0;i<G[u].size();i++)
  50. {
  51. edge e =edges[G[u][i]];
  52. if(dis[e.v]>dis[u]+e.w)
  53. {
  54. dis[e.v]=dis[u]+e.w;
  55. if(!vis[e.v])
  56. {
  57. vis[e.v]=1;
  58. q.push(e.v);
  59. }
  60. }
  61. }
  62. }
  63. }
  64. int main() {
  65.  
  66. while(cin>>n>>m)
  67. {
  68. init();
  69. for(int...
登录查看完整内容


登录后发布评论

2 条评论
admin SVIP
2025年3月10日 17:38

主要问题在于错误地提前对边权进行了取模运算,导致在比较路径总长度时使用了错误的值。正确的方法应避免在计算路径时取模,而是在最终结果输出时处理。然而,由于边权过大,无法直接计算,需采用并查集结合贪心策略,按边的顺序处理,确保路径的最优性。

赞(0)

sheep276 : 回复 admin: 懂了,感谢

2025年3月10日 19:38