首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐
2025年5月23日 星期五 6:34pm

poj3255 - Roadblocks

  • 24-03-05 07:00
  • 3547
  • 12038
blog.csdn.net

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

题目大意:在一个图上有许多个农场,有个人从1农场出发,到他的朋友n农场去,他不想走一条最短路径,这次他想换条路走,要你帮他找一条次短路径,次短路的定义是,比最短路径长度短(可能有多条),但是不会比其他的路径长度长。而且告诉你数据中一定存在至少一条次短路。


解题思路:大致的分析下,如果我们用常规思想做这题:
删除某一条边求最短路径,找出的最短路径比最短路径短,但是比其他路径长就是的了
这样做的时间复杂度是,spfa的时间复杂度大约是O(KE),E为边的总数=200000
然后枚举边O(E),那么总的时间复杂度为O(KE^2),大约是K*400亿。这样明显会超时。

最短路明显不会是次短路,因为题目说了次短一定是存在的,那么他们不可能重合,这样次短路肯定是最短路中某一条边不走,而走了其他边再回到最短路上,而且不可能绕两个地方,只可能绕一个地方,因为明显绕两个地方比绕一个地方的路径长,明显不是次短路了
所以我们枚举每条边
有d[s]---》源点到s的最短距离
有dr[t]----》t到汇点的最短距离,这样就需要从t到s求一次最短路得到了
len表示这条边的长度
然后我们枚举每一条边有:tmp=d[s]+dr[t]+len
找出其中比最短路小但是比其他路长的一个值就是次短路径了

 

  1. /*
  2. Memory 2644K
  3. Time 157MS
  4. */
  5. #include
  6. #include
  7. using namespace std;
  8. #define MAXV 5010
  9. #define MAXE 200100
  10. #define INF 1<<29
  11. typedef struct{
  12. int t,w,next;
  13. }Edge;
  14. Edge edge[MAXE];
  15. int d[MAXV],dr[MAXV];
  16. int n,m,edge_sum;
  17. int head[MAXV];
  18. bool vis[MAXV];
  19. void init(){
  20. memset(head,-1,sizeof(head));
  21. edge_sum=0;
  22. for(int i=1;i<=n;i++) d[i]=dr[i]=INF;
  23. }
  24. void addedge(int s,int t,int w){
  25. edge[edge_sum].t=t;
  26. edge[edge_sum].w=w;
  27. edge[edge_sum].next=head[s];
  28. head[s]=edge_sum++;
  29. }
  30. void spfa(int source,int dt[]){
  31. int i,v,u;
  32. queue <int>q;
  33. memset(vis,0,sizeof(vis));
  34. dt[source]=0;
  35. vis[source]=1;
  36. q.push(source);
  37. while(!q.empty()){
  38. v=q.front();q.pop();
  39. vis[v]=0;
  40. for(i=head[v];i!=-1;i=edge[i].next){
  41. u=edge[i].t;
  42. if(dt[v]+edge[i].w
  43. dt[u]=dt[v]+edge[i].w;
  44. if(!vis[u]){
  45. vis[u]=1;
  46. q.push(u);
  47. }
  48. }
  49. }
  50. }
  51. }
  52. int main(){
  53. int a,b,c;
  54. int ans,tmp,i;
  55. while(~scanf("%d%d",&n,&m)){
  56. init();
  57. while(m--){
  58. scanf("%d%d%d",&a,&b,&c);
  59. addedge(a,b,c);
  60. addedge(b,a,c);
  61. }
  62. spfa(1,d);
  63. spfa(n,dr);
  64. ans=INF;
  65. for(i=1;i<=n;i++){
  66. for(int j=head[i];j!=-1;j=edge[j].next){
  67. b=edge[j].t;
  68. c=edge[j].w;
  69. tmp=d[i]+dr[b]+c;
  70. if(tmp>d[n] && ans>tmp){
  71. ans=tmp;
  72. }
  73. }
  74. }
  75. printf("%d\n",ans);
  76. }
  77. return 0;
  78. }


 

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

/ 登录

评论记录:

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

分类栏目

后端 (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-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top