TOJ 3711 浪漫自习 最大流

柔情只为你懂 2022-05-27 04:48 234阅读 0赞

如今的校园谈恋爱已是习以为常,这不,去上自习也要成双成对的。现在假设某班里有N对情侣从同一寝室楼出发,到达同一个教室上自习。途中,她们可能会经过长廊、静溪等一系列的景点观光游览。但情侣们不希望在途中碰到班里的其他情侣而扫了雅兴。现在给定包括寝室、教室、以及各个景点在内共有M个场景,以及这些场景之间的路径分布情况,请您帮忙为情侣们设计各自单独的散步路线。

3711.jpg

输入

输入数据有多组,每组数据的第一行为2个正整数N(1<=N<=50)和M(2<=M<=50),分别表示共有N对情侣,M个场景,我们对场景从1~M进行编号。接下来的M行中,其中第i行的第一个数为正整数K,后面有K个正整数,表示与第i个场景之间有路径相连的场景编号。场景之间的路径是双向的,因此如果a与b之间有路径,那么b与a之间也必然有路径。我们始终假设:编号为1的场景是出发地——寝室楼,编号为2的场景是情侣们的目的地——自习教室。

当N和M均为0时输入结束。

输出

如果能够为情侣们设计出各自单独的散步路线(即除了出发地和目的地外,之间永远不会碰面),那么请输出YES,否则输出NO。

20180411205851597

提示

样例的第一个实例对应的解决方案是:

1->3->2

1->4->2

1->5->2

3711-2.jpg

把联通的路径设为1,直接求最大流就可以了。

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<math.h>
  4. #include<iostream>
  5. #include<string>
  6. #include<algorithm>
  7. #include<map>
  8. #include<queue>
  9. #include<vector>
  10. using namespace std;
  11. const int inf=0x7f7f7f7f;
  12. int n,m,G[55][55],flow[55],pre[55];
  13. queue<int> q;
  14. int bfs(int s,int t)
  15. {
  16. while(!q.empty())
  17. q.pop();
  18. memset(pre,-1,sizeof pre);
  19. pre[s]=0,flow[s]=inf;
  20. q.push(s);
  21. while(!q.empty())
  22. {
  23. int p=q.front();
  24. q.pop();
  25. if(p==t)break;
  26. for(int u=1;u<=n;u++)
  27. {
  28. if(u!=s&&G[p][u]>0&&pre[u]==-1)
  29. {
  30. pre[u]=p;
  31. flow[u]=min(flow[p],G[p][u]);
  32. q.push(u);
  33. }
  34. }
  35. }
  36. if(pre[t]==-1)return -1;
  37. return flow[t];
  38. }
  39. int EK(int s,int t)
  40. {
  41. int delta=0,tot=0;
  42. while(1)
  43. {
  44. delta=bfs(s,t);
  45. if(delta==-1)break;
  46. int p=t;
  47. while(p!=s)
  48. {
  49. G[pre[p]][p]-=delta;
  50. G[p][pre[p]]+=delta;
  51. p=pre[p];
  52. }
  53. tot+=delta;
  54. }
  55. return tot;
  56. }
  57. int main()
  58. {
  59. int i,j,t,tl;
  60. while(scanf("%d%d",&m,&n))
  61. {
  62. if(n==0&&m==0)break;
  63. memset(G,0,sizeof G);
  64. memset(flow,0,sizeof flow);
  65. for(i=1;i<=n;i++)
  66. {
  67. scanf("%d",&t);
  68. for(j=0;j<t;j++)
  69. {
  70. scanf("%d",&tl);
  71. G[i][tl]=G[tl][i]=1;
  72. }
  73. }
  74. //printf("%d\n",EK(1,2));
  75. int sum=EK(1,2);
  76. if(sum>=m)
  77. printf("YES\n");
  78. else
  79. printf("NO\n");
  80. }
  81. }

发表评论

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

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

相关阅读

    相关 算法

    最大流问题综述:源节点s ,目的地t,从源节点s和t  之间 ,可以流动的最大量是多少。 s和t之间的每一条边f(u,v)/c(u,v)  表示分开流 和容量 残存网络:

    相关 问题

    举例描述 最大流问题是一个很经典的问题,很多人对此也很熟悉,它能够等同于一个线性规划问题。下面给出最大流问题的一个基本描述:如下图所示,s是源点,t为汇点,每条边上数字的

    相关 TOJ 3711 浪漫自习

    如今的校园谈恋爱已是习以为常,这不,去上自习也要成双成对的。现在假设某班里有N对情侣从同一寝室楼出发,到达同一个教室上自习。途中,她们可能会经过长廊、静溪等一系列的景点观光游览

    相关 问题

    举例描述 最大流问题是一个很经典的问题,很多人对此也很熟悉,它能够等同于一个线性规划问题。下面给出最大流问题的一个基本描述:如下图所示,s是源点,t为汇点,每条边上数字的

    相关 问题

    定义 有m条管道,n个节点,1为水源(源点),n为终点(汇点),每条管道有水流量上限,问如何分配每条水管的流量才能使终点处接受到的水流量最大。 最小割最大流定理:是指在