poj 2455 二分+最大流

谁践踏了优雅 2022-01-07 08:51 275阅读 0赞

这个因为点少用邻接矩阵做的。

题意:求由1到n的t条不重复路径中最大边权值的最小值。

思路:先对边权进行排序,然后二分边权值,建图求从1到n的最大流,当最大流为t时便求出答案。

代码:

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. #define N 210
  7. int n,m,t;
  8. int a,b,c;
  9. int map[210][210];
  10. struct Edge
  11. {
  12. int u,v,w;
  13. }edge[40001];
  14. bool cmp(Edge a,Edge b)
  15. {
  16. return a.w<b.w;
  17. }
  18. int sap()
  19. {
  20. int pre[N],dis[N],gap[N],aug=-1,maxflow=0,u;
  21. int s=1,t=n;
  22. memset(gap,0,sizeof(gap));
  23. memset(dis,0,sizeof(dis));
  24. u=pre[s]=s;
  25. gap[0]=t;
  26. while(dis[s]<t)
  27. {
  28. loop:for(int i=1;i<=t;i++)
  29. {
  30. if(map[u][i]&&dis[u]==dis[i]+1)
  31. {
  32. if(aug==-1||aug>map[u][i])
  33. aug=map[u][i];
  34. pre[i]=u;
  35. u=i;
  36. if(u==t)
  37. {
  38. maxflow+=aug;
  39. for(int v=t;v!=s;v=pre[v])
  40. {
  41. map[pre[v]][v]-=aug;
  42. map[v][pre[v]]+=aug;
  43. }
  44. aug=-1;
  45. u=s;
  46. }
  47. goto loop;
  48. }
  49. }
  50. int mindis=t-1;
  51. for(int i=1;i<=t;i++)
  52. if(map[u][i]&&dis[i]<mindis)
  53. mindis=dis[i];
  54. if((--gap[dis[u]])==0) break;
  55. gap[dis[u]=mindis+1]++;
  56. u=pre[u];
  57. }
  58. return maxflow;
  59. }
  60. void build(int x)
  61. {
  62. memset(map,0,sizeof(map));
  63. for(int i=0;i<=x;i++)
  64. {
  65. int u,v;
  66. u=edge[i].u;
  67. v=edge[i].v;
  68. map[u][v]++;
  69. map[v][u]++;
  70. }
  71. }
  72. bool check(int x)
  73. {
  74. build(x);
  75. int maxflow=sap();
  76. if(maxflow>=t)
  77. {
  78. return true;
  79. }
  80. return false;
  81. }
  82. int main()
  83. {
  84. while(scanf("%d%d%d",&n,&m,&t)!=EOF)
  85. {
  86. memset(edge,0,sizeof(edge));
  87. memset(map,0,sizeof(map));
  88. for(int i=0;i<m;i++)
  89. {
  90. scanf("%d%d%d",&a,&b,&c);
  91. edge[i].u=a;
  92. edge[i].v=b;
  93. edge[i].w=c;
  94. }
  95. sort(edge,edge+m,cmp);
  96. int l=0,r=m-1;
  97. while(r>=l)
  98. {
  99. int mid=(l+r)>>1;
  100. if(check(mid))
  101. {
  102. r=mid-1;
  103. }
  104. else l=mid+1;
  105. }
  106. printf("%d\n",edge[r+1].w);
  107. }
  108. }

转载于:https://www.cnblogs.com/amourjun/p/5134103.html

发表评论

表情:
评论列表 (有 0 条评论,275人围观)

还没有评论,来说两句吧...

相关阅读

    相关 poj 2455 二分+

    这个因为点少用邻接矩阵做的。 题意:求由1到n的t条不重复路径中最大边权值的最小值。 思路:先对边权进行排序,然后二分边权值,建图求从1到n的最大流,当最大流为t时便求出答