有趣啊

先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #include<vector>
  6. using namespace std;
  7. const int N=1505,inf=1e9;
  8. int n,m,x1,x2,y1,y2,d[N],dis[N],h[N],cnt,s1[N],s2[N],t1[N],t2[N];
  9. bool v[N];
  10. struct qwe
  11. {
  12. int ne,no,to,va;
  13. }e[1000005];
  14. struct bian
  15. {
  16. int u,v,w;
  17. bian(int U=0,int V=0,int W=0)
  18. {
  19. u=U,v=V,w=W;
  20. }
  21. };
  22. vector<bian>ve;
  23. void add(int u,int v,int w)
  24. {
  25. cnt++;
  26. e[cnt].ne=h[u];
  27. e[cnt].no=u;
  28. e[cnt].to=v;
  29. e[cnt].va=w;
  30. h[u]=cnt;
  31. }
  32. void spfa(int s,int dis[])
  33. {
  34. queue<int>q;
  35. for(int i=1;i<=n;i++)
  36. dis[i]=inf,v[i]=0;
  37. dis[s]=0;
  38. v[s]=1;
  39. q.push(s);
  40. while(!q.empty())
  41. {
  42. int u=q.front();
  43. q.pop();
  44. v[u]=0;
  45. for(int i=h[u];i;i=e[i].ne)
  46. if(dis[e[i].to]>dis[u]+e[i].va)
  47. {
  48. dis[e[i].to]=dis[u]+e[i].va;
  49. if(!v[e[i].to])
  50. {
  51. v[e[i].to]=1;
  52. q.push(e[i].to);
  53. }
  54. }
  55. }
  56. }
  57. int main()
  58. {
  59. scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2);
  60. for(int i=1,x,y,v;i<=m;i++)
  61. {
  62. scanf("%d%d%d",&x,&y,&v);
  63. add(x,y,v),add(y,x,v);
  64. }
  65. spfa(x1,s1);
  66. spfa(y1,t1);
  67. spfa(x2,s2);
  68. spfa(y2,t2);
  69. for(int i=1;i<=cnt;i+=2)
  70. if(min(s1[e[i].no],s1[e[i].to])+min(t1[e[i].to],t1[e[i].no])+e[i].va==s1[y1]&&min(s2[e[i].no],s2[e[i].to])+min(t2[e[i].no],t2[e[i].to])+e[i].va==s2[y2])
  71. {
  72. if(s1[e[i].no]<s1[e[i].to])
  73. ve.push_back(bian(e[i].no,e[i].to,e[i].va));
  74. else
  75. ve.push_back(bian(e[i].to,e[i].no,e[i].va));
  76. }
  77. memset(h,0,sizeof(h));
  78. cnt=0;
  79. for(int i=0;i<ve.size();i++)
  80. add(ve[i].u,ve[i].v,ve[i].w),d[ve[i].v]++;
  81. queue<int>q;
  82. for(int i=1;i<=n;i++)
  83. {
  84. dis[i]=0;
  85. if(!d[i])
  86. q.push(i);
  87. }
  88. int ans=0;
  89. while(!q.empty())
  90. {
  91. int u=q.front();
  92. q.pop();
  93. for(int i=h[u];i;i=e[i].ne)
  94. {
  95. dis[e[i].to]=max(dis[e[i].to],dis[u]+e[i].va);
  96. ans=max(ans,dis[e[i].to]);
  97. d[e[i].to]--;
  98. if(!d[e[i].to])
  99. q.push(e[i].to);
  100. }
  101. }
  102. printf("%d\n",ans);
  103. return 0;
  104. }

bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】的更多相关文章

  1. bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1944  Solved: 759[Submit][St ...

  2. [BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA & 拓扑排序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  3. BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )

    找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案 ---- ...

  4. bzoj 1880: [Sdoi2009]Elaxia的路线

    Description 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希 ...

  5. [luogu2149][bzoj1880][SDOI2009]Elaxia的路线【拓扑排序+最短路+DP】

    题目描述 最近,Elaxia和w的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia和w每天都要奔波于宿舍和实验室之间,他们 希望在节约时间 ...

  6. bzoj 1880 [Sdoi2009]Elaxia的路线(最短路+拓扑序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  7. 【BZOJ 1880】 [Sdoi2009]Elaxia的路线 (最短路树)

    1880: [Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. ...

  8. BZOJ-1880 Elaxia的路线 SPFA+枚举

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec Memory Limit: 64 MB Submit: 921 Solved: 354 [Submit][Sta ...

  9. BZOJ1880: [Sdoi2009]Elaxia的路线(最短路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2049  Solved: 805 题目链接:https ...

随机推荐

  1. CodeIgniter与Zend Acl结合实现轻量级权限控制

    CodeIgniter与Zend Acl结合实现轻量级权限控制 Tag :CodeIgniter Zend Acl 权限控制 1. Zend_Acl简介 Zend_Acl 为权限管理提供轻量并灵活的访 ...

  2. D. Spongebob and Squares--cf599D(数学)

    http://codeforces.com/problemset/problem/599/D 题目大意:给你一个数k  让你求一个n*m的矩形里面包含k个正方形   输出有几个这样的矩形  分别是什么 ...

  3. 2018.11.3 PION模拟赛

    期望:100    实际:100 #include<cstdio> #include<cstring> #include<iostream> #include< ...

  4. 元数据的概念以及相关的操作os模块、shutil模块

    查看文件的元数据 stat [OPTION]… FILE… OPTION: -f 输出文件系统的状态,而非文件的状态 -t 显示简要格式的文件元数据信息 FILE:可同时查看多个文件的元数据信息,多个 ...

  5. C++ std::tr1::bind使用

    1. 简述 同function函数相似.bind函数相同也能够实现相似于函数指针的功能.但却却比函数指针更加灵活.特别是函数指向类 的非静态成员函数时.std::tr1::function 能够对静态 ...

  6. InnoDB: Error: io_setup() failed with EAGAIN after 5 attempts

    在一台server中以各数据库的备份文件为数据文件启动多个MySQL实例供SQL Review使用. 之前执行一直没有问题(最多的时候有23个MySQL实例同一时候执行).后来新配置了一台server ...

  7. 实战c++中的string系列--指定浮点数有效数字并转为string

    上一篇博客讲了好几种方法进行number到string的转换,这里再单独说一下float或是double到string的转换. 还是处于控件显示的原因.比方说要显示文件的大小,我们从server能够获 ...

  8. 【iOS开发】-NSString的扩展使用

    第一:基本数据类型与字符串转换 //基本数据类型(int float,double char) 1)基本数据类型->NSString //1.int类型换换成字符串 int a = 88; NS ...

  9. instruction set汇总

    1 aarch64 它armv8-A架构的一种执行状态,之所以说它是一种执行状态是因为,armv8-A还有aarch32这个执行状态.aarch64是64位执行状态,aarch32是32位的执行状态. ...

  10. 城域网IPv6过渡技术—NAT64+DNS64 Test for IPv6 DNS64/NAT64 Compatibility Regularly

    城域网IPv6过渡技术—NAT64+DNS64 - 51CTO.COM http://network.51cto.com/art/201311/419623.htm Supporting IPv6 D ...