首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

poj1502 - MPI Maelstrom

  • 24-03-05 07:00
  • 4810
  • 11203
blog.csdn.net

                                    想看更多的解题报告: http://iyenn.com/rec/1824570.html
                                     转载请注明出处:
http://blog.csdn.net/wangjian8006

题意:
给你一个不完全的矩阵,数字表示权值,x表示两点间不可达
由于自身到自身花费的时间为0,所以没有给出,由于i到j和j到i距离相同,互达时间相同
所以只给出了一半的临界矩阵。
根据给你的这个临界矩阵,让你来求从点1到其他点所花费最短时间集里面的的最大值。
其实这是一个很直接的最短路

为了向熟悉下各个最短路的模板,将所有的模板都用了对比下,写了一遍最短路径

 

  1. /*
  2. dijstra
  3. Memory 160K
  4. Time 0MS
  5. */#include
  6. #include
  7. using namespace std;
  8. #define MAXV 102
  9. #define INF 100000
  10. int map[MAXV][MAXV],n;
  11. void dijstra(){
  12. int i,j,ans=-1,min,v;
  13. int d[MAXV],vis[MAXV];
  14. //d数组表示从原点到i点的最短距离
  15. //vis用于表达这个点是否已经被选中
  16. for(i=1;i<=n;i++){
  17. d[i]=INF;
  18. vis[i]=0;
  19. }
  20. d[1]=0; //因为start到start的距离为0,这里源点为1
  21. for(i=1;i<=n;i++){
  22. min=INF;
  23. for(j=1;j<=n;j++){ //每次找点的过程,首先这个点没有被发现,然后找一个最小点
  24. if(!vis[j] && d[j]
  25. min=d[j];
  26. v=j;
  27. }
  28. }
  29. //这里为什么找的最小的边就一定是最短路呢
  30. //因为一个图要连通起来,就必须有一条边和已知点集连起来,所以找的最小的未知点必是最短路
  31. vis[v]=1;
  32. for(j=1;j<=n;j++) //加进最小点后,再修改从源点没有被发现的点的最短路径
  33. if(!vis[j] && d[v]+map[v][j]
  34. d[j]=d[v]+map[v][j];
  35. }
  36. for(i=2;i<=n;i++)
  37. if(d[i]>ans) ans=d[i];
  38. printf("%d\n",ans);
  39. }
  40. int main(){
  41. char s[10];
  42. int i,j;
  43. while(~scanf("%d\n",&n)){
  44. for(i=1;i<=n;i++)
  45. for(j=1;j<=n;j++)
  46. if(i!=j)
  47. map[i][j]=INF;
  48. else
  49. map[i][j]=0;
  50. for(i=2;i<=n;i++)
  51. for(j=1;j
  52. scanf("%s",s);
  53. if(s[0]!='x')
  54. map[i][j]=map[j][i]=atoi(s); //将字符串转换为数字
  55. }
  56. dijstra();
  57. }
  58. return 0;
  59. }


=============================================================

  1. /*
  2. bellman-ford
  3. Memory 152K
  4. Time 16MS
  5. */#include
  6. #include
  7. using namespace std;
  8. #define MAXE 10002
  9. #define MAXV 102
  10. #define INF 100000
  11. struct {
  12. int s,e,w;
  13. }t[MAXE];
  14. int n,m;
  15. void bellman_ford(){
  16. int i,j,ans=-1,start=1;
  17. int d[MAXV];
  18. for(i=1;i<=n;i++) d[i]=INF;
  19. d[start]=0;
  20. for (i=1;i//重复进行n-1次收缩
  21. for (j=0;j//对每条边进行收缩
  22. if (d[t[j].s]+t[j].w
  23. //分别对每条边的两个顶点分别进行收缩
  24. if (d[t[j].e]+t[j].w
  25. }
  26. }
  27. for(i=2;i<=n;i++)
  28. if(d[i]>ans) ans=d[i];
  29. printf("%d\n",ans);
  30. }
  31. int main(){
  32. char s[10];
  33. int i,j;
  34. while(~scanf("%d\n",&n)){
  35. m=0;
  36. for(i=2;i<=n;i++)
  37. for(j=1;j
  38. scanf("%s",s);
  39. if(s[0]!='x'){
  40. t[m].w=atoi(s);
  41. t[m].s=i;
  42. t[m++].e=j;
  43. }
  44. }
  45. bellman_ford();
  46. }
  47. return 0;
  48. }


 

============================================================================

 

  1. /*
  2. spfa 邻接表
  3. Memory 208K
  4. Time 16MS
  5. */#include <iostream>
  6. #include <queue>
  7. #include <string.h>
  8. using namespace std;
  9. #define MAXE 10002
  10. #define MAXV 102
  11. #define INF 100000
  12. struct {
  13. int s,e,w,next;
  14. }t[MAXE];
  15. int n,m,headlist[MAXV];
  16. void spfa(){
  17. int i,ans=-1,start=1,v,b;
  18. int d[MAXV],vis[MAXV];
  19. queue <int>q;
  20. for(i=1;i<=n;i++){
  21. d[i]=INF;
  22. vis[i]=0;
  23. }
  24. d[start]=0;
  25. vis[start]=1;
  26. q.push(start);
  27. while(!q.empty()){
  28. v=q.front();
  29. q.pop();
  30. vis[v]=0;
  31. for(i=headlist[v];i!=-1;i=t[i].next){
  32. b=t[i].s;
  33. if(d[v]+t[i].w
  34. d[b]=d[v] + t[i].w;
  35. if(!vis[b]){
  36. vis[b]=1;
  37. q.push(b);
  38. }
  39. }
  40. }
  41. }
  42. for(i=2;i<=n;i++)
  43. if(d[i]>ans) ans=d[i];
  44. printf("%d\n",ans);
  45. }
  46. int main(){
  47. char s[10];
  48. int i,j;
  49. while(~scanf("%d\n",&n)){
  50. for(i=1;i<=n;i++) headlist[i]=-1;
  51. m=0;
  52. for(i=2;i<=n;i++)
  53. for(j=1;j
  54. scanf("%s",s);
  55. if(s[0]!='x'){
  56. //无向图的spfa的边要存两遍
  57. t[m].w=atoi(s);
  58. t[m].s=i;
  59. t[m].e=j;
  60. t[m].next=headlist[j];
  61. headlist[j]=m++;
  62. t[m].w=atoi(s);
  63. t[m].s=j;
  64. t[m].e=i;
  65. t[m].next=headlist[i];
  66. headlist[i]=m++;
  67. }
  68. }
  69. spfa();
  70. }
  71. return 0;
  72. }


===================================================================================

 

  1. /*
  2. spfa邻接矩阵
  3. Memory 172K
  4. Time 0MS
  5. */
  6. #include
  7. #include
  8. #include
  9. using namespace std;
  10. #define MAXV 102
  11. #define INF 100000
  12. int map[MAXV][MAXV],n;
  13. void spfa(){
  14. int i,j,ans=-1,v,start=1;
  15. int d[MAXV],vis[MAXV];
  16. queue <int>q;
  17. for(i=1;i<=n;i++){
  18. d[i]=INF;
  19. vis[i]=0;
  20. }
  21. q.push(start);
  22. d[start]=0;
  23. vis[start]=1;
  24. while(!q.empty()){
  25. v=q.front();
  26. q.pop();
  27. vis[v]=0;
  28. for(i=1;i<=n;i++){
  29. if(d[i]>d[v]+map[v][i]){
  30. d[i]=d[v]+map[v][i];
  31. if(!vis[i]){
  32. q.push(i);
  33. vis[i]=1;
  34. }
  35. }
  36. }
  37. }
  38. for(i=2;i<=n;i++)
  39. if(d[i]>ans) ans=d[i];
  40. printf("%d\n",ans);
  41. }
  42. int main(){
  43. char s[10];
  44. int i,j;
  45. while(~scanf("%d\n",&n)){
  46. for(i=1;i<=n;i++)
  47. for(j=1;j<=n;j++)
  48. if(i!=j)
  49. map[i][j]=INF;
  50. else
  51. map[i][j]=0;
  52. for(i=2;i<=n;i++)
  53. for(j=1;j
  54. scanf("%s",s);
  55. if(s[0]!='x')
  56. map[i][j]=map[j][i]=atoi(s);
  57. }
  58. spfa();
  59. }
  60. return 0;
  61. }


 

 

 

 

注:本文转载自blog.csdn.net的wangjian8006的文章"http://blog.csdn.net/wangjian8006/article/details/7871129"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top