图论模版

举报
Linux猿 发表于 2021/08/05 01:22:47 2021/08/05
【摘要】 Dijkstra+邻接表(HDU 2544 最短路) #include<stdio.h>#include<iostream>#include<map>#include<string>#include<string.h>#include<stdlib.h>#include<math.h>#in...

Dijkstra+邻接表(HDU 2544 最短路)


  
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<map>
  4. #include<string>
  5. #include<string.h>
  6. #include<stdlib.h>
  7. #include<math.h>
  8. #include<vector>
  9. #include<queue>
  10. #include<algorithm>
  11. using namespace std ;
  12. #define pret(a,b) memset(a,b,sizeof(a))
  13. const int INF = 99999999 ;
  14. const int MX= 20005 ;
  15. int n,m,top ;
  16. bool vis[MX] ;
  17. int d[MX] ;
  18. struct vertx // 与要查找顶点相关的第一个边序号
  19. {
  20. int head ;
  21. }V[MX] ;
  22. struct Edge
  23. {
  24. int v,w ;
  25. int next ; //下标和内容均为边序号
  26. }E[MX] ;
  27. void add_edge(int u,int v,int w) // 无向图
  28. {
  29. E[top].v=v ;
  30. E[top].w=w ;
  31. E[top].next=V[u].head ;
  32. V[u].head=top++ ;
  33. E[top].v=u ;
  34. E[top].w=w ;
  35. E[top].next=V[v].head ;
  36. V[v].head=top++ ;
  37. }
  38. void init() // 初始化
  39. {
  40. pret(vis,false) ;
  41. pret(V,-1) ;
  42. top=0 ;
  43. }
  44. void Dijkstra()
  45. {
  46. for(int i=0 ;i<n ;i++)
  47. d[i]=INF ;
  48. d[0]=0 ;
  49. for(int i=0 ;i<n ;i++)
  50. {
  51. int min=INF,sx ;
  52. for(int j=0 ;j<n ;j++)
  53. if(!vis[j]&&d[j]<min)
  54. min=d[sx=j] ;
  55. if(min==INF) break ;
  56. vis[sx]=true ;
  57. for(int j=V[sx].head ;j!=-1 ;j=E[j].next)
  58. {
  59. int sy=E[j].v ;
  60. if(!vis[sy]&&d[sx]+E[j].w<d[sy])
  61. d[sy]=d[sx]+E[j].w ;
  62. }
  63. }
  64. }
  65. int main()
  66. {
  67. int u,v,w ;
  68. while(~scanf("%d%d",&n,&m)&&(n||m))
  69. {
  70. init() ;
  71. for(int i=0 ;i<m ;i++)
  72. {
  73. scanf("%d%d%d",&u,&v,&w) ;
  74. u-- ; v-- ; // 下标从零开始
  75. add_edge(u,v,w) ;
  76. }
  77. Dijkstra() ;
  78. printf("%d\n",d[n-1]) ;
  79. }
  80. return 0 ;
  81. }

Dijstra + 邻接表 + 优先队列


  
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<map>
  4. #include<string>
  5. #include<string.h>
  6. #include<stdlib.h>
  7. #include<math.h>
  8. #include<vector>
  9. #include<queue>
  10. #include<algorithm>
  11. using namespace std ;
  12. #define pret(a,b) memset(a,b,sizeof(a))
  13. const int INF = 99999999 ;
  14. const int MX= 20005 ;
  15. int n,m,top ;
  16. bool vis[MX] ;
  17. int d[MX] ;
  18. struct node
  19. {
  20. int x,w ;
  21. friend bool operator < (const node &a,const node &b)
  22. {
  23. return a.w > b.w ;
  24. }
  25. } ;
  26. struct vertx // 与要查找顶点相关的第一个边序号
  27. {
  28. int head ;
  29. }V[MX] ;
  30. struct Edge
  31. {
  32. int v,w ;
  33. int next ; //下标和内容均为边序号
  34. }E[MX] ;
  35. void add_edge(int u,int v,int w) // 无向图
  36. {
  37. E[top].v=v ;
  38. E[top].w=w ;
  39. E[top].next=V[u].head ;
  40. V[u].head=top++ ;
  41. E[top].v=u ;
  42. E[top].w=w ;
  43. E[top].next=V[v].head ;
  44. V[v].head=top++ ;
  45. }
  46. void init() // 初始化
  47. {
  48. pret(vis,false) ;
  49. pret(V,-1) ;
  50. top=0 ;
  51. }
  52. void Dijkstra()
  53. {
  54. priority_queue<node>Q ;
  55. for(int i=0 ;i<n ;i++)
  56. d[i]=INF ;
  57. d[0]=0 ;
  58. node curt ;
  59. curt.x=0 ;curt.w=0 ;
  60. Q.push(curt) ;
  61. while(!Q.empty())
  62. {
  63. curt=Q.top() ;
  64. Q.pop() ;
  65. int sx=curt.x ;
  66. if(vis[sx]) continue ; // 标记顶点
  67. vis[sx]=true ;
  68. for(int e=V[sx].head ; e!=-1 ;e=E[e].next) // 更新
  69. {
  70. int sy=E[e].v ;
  71. if(d[sx]+E[e].w<d[sy])
  72. {
  73. d[sy]=d[sx]+E[e].w ;
  74. curt.x=sy ;
  75. curt.w=d[sy] ;
  76. Q.push(curt) ;
  77. }
  78. }
  79. }
  80. }
  81. int main()
  82. {
  83. int u,v,w ;
  84. while(~scanf("%d%d",&n,&m)&&(n||m))
  85. {
  86. init() ;
  87. for(int i=0 ;i<m ;i++)
  88. {
  89. scanf("%d%d%d",&u,&v,&w) ;
  90. u-- ; v-- ; // 下标从零开始
  91. add_edge(u,v,w) ;
  92. }
  93. Dijkstra() ;
  94. printf("%d\n",d[n-1]) ;
  95. }
  96. return 0 ;
  97. }

Spfa ( HDU 1874 畅通工程续 ) (别忘了在主函数里调用 init( ) 函数!!!)


  
  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<map>
  4. #include<string>
  5. #include<string.h>
  6. #include<stdlib.h>
  7. #include<math.h>
  8. #include<vector>
  9. #include<queue>
  10. #include<algorithm>
  11. using namespace std ;
  12. #define pret(a,b) memset(a,b,sizeof(a))
  13. const int INF = 99999999 ;
  14. const int MX= 20005 ;
  15. int n,m,top ;
  16. bool vis[MX] ;
  17. int d[MX] ;
  18. struct vertx
  19. {
  20. int head ;
  21. }V[MX] ;
  22. struct Edge
  23. {
  24. int v,w ;
  25. int next ;
  26. }E[MX] ;
  27. void init()
  28. {
  29. pret(vis,false) ;
  30. pret(V,-1) ;
  31. for(int i=0 ;i<n ;i++)
  32. d[i]=INF ;
  33. top=0 ;
  34. }
  35. void add_edge(int u,int v,int w)
  36. {
  37. E[top].v=v ;
  38. E[top].w=w ;
  39. E[top].next=V[u].head ;
  40. V[u].head=top++ ;
  41. E[top].v=u ;
  42. E[top].w=w ;
  43. E[top].next=V[v].head ;
  44. V[v].head=top++ ;
  45. }
  46. void Spfa(int s)
  47. {
  48. queue<int>q ;
  49. vis[s]=true ;
  50. d[s]=0 ;
  51. q.push(s) ;
  52. while(!q.empty())
  53. {
  54. int x=q.front() ;
  55. q.pop() ;
  56. vis[x]=false ;
  57. for(int i=V[x].head ;i!=-1 ;i=E[i].next)
  58. {
  59. int p=E[i].v ;
  60. if(d[x]+E[i].w<d[p])
  61. {
  62. d[p]=d[x]+E[i].w ;
  63. if(!vis[p])
  64. {
  65. //判断环放在这里面 vis[p]=true ;
  66. q.push(p) ;
  67. }
  68. }
  69. }
  70. }
  71. }
  72. int main()
  73. {
  74. int u,v,w,x,y ;
  75. while(~scanf("%d%d",&n,&m)&&(n||m))
  76. {
  77. init() ;
  78. for(int i=0 ;i<m ;i++)
  79. {
  80. scanf("%d%d%d",&u,&v,&w) ;
  81. add_edge(u,v,w) ;
  82. }
  83. scanf("%d%d",&x,&y) ;
  84. Spfa(x) ;
  85. printf("%d\n",d[y]==INF ? -1 : d[y]) ;
  86. }
  87. return 0 ;
  88. }



 

文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/20689137

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。