菜鸟物流的运输网络(计蒜客复赛F)
菜鸟物流有自己的运输网络,网络中包含 nn 个城市物流集散中心,和 mm 对城市之间的运输线路(线路是双向的)。菜鸟物流允许淘宝卖家自行确定包裹的运输路径,但只有一条限制规则:不允许经过重复的城市。淘宝卖家小明从 aa城市寄出快递后,希望包裹在 midmid 城市进行包装加工以后再寄往 bb 城市。
现在小明希望算出一个满足他需求的合法运输路径,你可以帮他算出来么?
已知这样的方案一定存在。请为小明输出任意一个可行方案。
输入格式
第一行一个正整数 T(1 \leq T \leq 10)T(1≤T≤10) 表示数据的组数。
每组数据第一行 22 个正整数 n,m(3 \leq n \leq 100,m \leq \frac{n(n-1)}{2})n,m(3≤n≤100,m≤2n(n−1)),表示城市个数和运输线路数目。
第二行 33 个互不相同正整数 a,b,mid(1 \leq a,b,mid \leq n)a,b,mid(1≤a,b,mid≤n),表示起点、终点和途径城市。
接下来 mm 行,每行 22 个正整数 x,y(1\leq x,y \leq n)x,y(1≤x,y≤n),表示每条线路连接的 22个城市。
每组数据一定存在至少一组合法方案。如果有多种满足小明需求的合法运输路径,输出任意一个即可。
输出格式
每组数据输出 LL 个正整数,表示顺次经过的城市的编号,包括起点和终点。每两个整数之间一个空格,最后一个整数后面没有空格。
样例输入
1
5 5
1 5 3
1 2
2 3
3 4
4 5
5 1
样例输出
1 2 3 4 5
思路:网络流。拆点,以mid为超级源点,流为2,然后在起点和终点加一个超级汇点,然后每个点除了mid都拆成两个点流为1,然后mid拆成流为2的,最后跑Dinic
这样保证了,每个点最多经过一次。然后找路径的话只要从起点和终点,然后找这一个点到其他点流为1的就是这个点的上一个经过的点,因为上个点到这个点的流由一变0,然后反边为1。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<algorithm>
4 #include<iostream>
5 #include<math.h>
6 #include<string.h>
7 #include<vector>
8 #include<queue>
9 using namespace std;
10 int n,m,mid;
11 struct node
12 {
13 int to;
14 int cap;
15 int rev;
16 };
17 int nn,mm;
18 vector<node>vec[1000];
19 int level[1000];
20 int iter[1000];
21 void add(int from,int to,int cap);
22 void bfs(int s);
23 int dfs(int s,int t,int f);
24 int max_flow(int s,int t);
25 int vv[1000];
26 int main(void)
27 {
28 int i,j,k;
29 scanf("%d",&k);
30 while(k--)
31 {
32 for(i=0; i<1000; i++)
33 vec[i].clear();
34 scanf("%d %d",&nn,&mm);
35 scanf("%d %d %d",&n,&m,&mid);
36 for(i=1; i<=nn; i++)
37 {
38 if(i!=mid)
39 {
40 add(i,i+nn,1);
41 }
42 }
43 add(mid,mid+nn,2);
44 int x,y;
45 while(mm--)
46 {
47
48 scanf("%d %d",&x,&y);
49 if(x==n&&y==m||x==m&&y==n)
50 {
51 continue;
52 }
53 else
54 {
55 add(x+nn,y,1);
56 add(y+nn,x,1);
57 }
58 }
59 add(n+nn,2*nn+1,1);
60 add(m+nn,2*nn+1,1);
61 int akk= max_flow(mid,2*nn+1);
62 int a=n;
63 int b=m;
64 int ans[200];
65 int cnt=0;
66 memset(vv,0,sizeof(vv));
67 for(i=1; i<=nn; i++)
68 {
69 if(i!=mid)
70 { int uu; for(uu=0; uu<vec[i].size(); uu++)
71 {
72 node ad=vec[i][uu];
73 if(ad.cap)
74 break;
75 }
76 int ak=vec[i][uu].to;
77 vv[i]=ak-nn;
78
79 }
80 }
81 while(a!=mid)
82 {
83 printf("%d ",a);
84 a=vv[a];
85 }
86 printf("%d ",mid);
87 int cc[105];
88 int ic=0;
89 while(b!=mid)
90 {
91 cc[ic++]=b;
92 b=vv[b];
93 }
94 for(i=ic-1; i>=1; i--)
95 {
96 printf("%d ",cc[i]);
97 }
98 printf("%d\n",m);
99 }
100 return 0;
101 }
102 void add(int from,int to,int cap)
103 {
104 node dd;
105 dd.to=to;
106 dd.cap=cap;
107 dd.rev=vec[to].size();
108 vec[from].push_back(dd);
109 dd.to=from;
110 dd.cap=0;
111 dd.rev=vec[from].size()-1;
112 vec[to].push_back(dd);
113 }
114 void bfs(int s)
115 {
116 queue<int>que;
117 memset(level,-1,sizeof(level));
118 level[s]=0;
119 que.push(s);
120 while(!que.empty())
121 {
122 int v=que.front();
123 que.pop();
124 int i;
125 for(i=0; i<vec[v].size(); i++)
126 {
127 node e=vec[v][i];
128 if(level[e.to]==-1&&e.cap>0)
129 {
130 level[e.to]=level[v]+1;
131 que.push(e.to);
132 }
133 }
134 }
135 }
136 int dfs(int s,int t,int f)
137 {
138 if(s==t)
139 return f;
140 for(int &i=iter[s]; i<vec[s].size(); i++)
141 {
142 node &e=vec[s][i];
143 if(level[e.to]>level[s]&&e.cap>0)
144 {
145 int r=dfs(e.to,t,min(e.cap,f));
146 if(r>0)
147 {
148 e.cap-=r;
149 vec[e.to][e.rev].cap+=r;
150 return r;
151 }
152 }
153 }
154 return 0;
155 }
156 int max_flow(int s,int t)
157 {
158 int flow=0;
159 for(;;)
160 {
161 bfs(s);
162 if(level[t]<0)
163 return flow;
164 memset(iter,0,sizeof(iter));
165 int f;
166 while((f=dfs(s,t,10))>0)
167 {
168 flow+=f;
169 }
170 }
171 }
菜鸟物流的运输网络(计蒜客复赛F)的更多相关文章
- 计蒜客 作弊揭发者(string的应用)
鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统.当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字.字母序列识别车牌,通过连接车管所车辆信息数据库 ...
- 计蒜客的一道题dfs
这是我无聊时在计蒜客发现的一道题. 题意: 蒜头君有一天闲来无事和小萌一起玩游戏,游戏的内容是这样的:他们不知道从哪里找到了N根不同长度的木棍, 看谁能猜出这些木棍一共能拼出多少个不同的不等边三角形. ...
- 计蒜客模拟赛5 D2T1 成绩统计
又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...
- 计蒜客 等边三角形 dfs
题目: https://www.jisuanke.com/course/2291/182238 思路: 1.dfs(int a,int b,int c,int index)//a,b,c三条边的边长, ...
- 计蒜客 方程的解数 dfs
题目: https://www.jisuanke.com/course/2291/182237 思路: 来自:https://blog.csdn.net/qq_29980371/article/det ...
- 计蒜客 买书 dfs
题目: https://www.jisuanke.com/course/2291/182236 思路: 递归解决,从第一本书开始,每本书都有两种选择: //index是book里面每本书价格的下标, ...
- 计蒜客:Entertainment Box
Ada, Bertrand and Charles often argue over which TV shows to watch, and to avoid some of their fight ...
- 爬虫acm比赛成绩(多页成绩整合在一起、获取复制不了的数据)(hihocoder、计蒜客)
https://github.com/congmingyige/web-crawler_rank-of-competition-in-JiSuanKe-and-hihocoder 1. 计蒜客(获取复 ...
- 计蒜客 31436 - 提高水平 - [状压DP]
题目链接:https://nanti.jisuanke.com/t/31436 作为一名车手,为了提高自身的姿势水平,平时的练习是必不可少的.小 J 每天的训练包含 $N$ 个训练项目,他会按照某个顺 ...
随机推荐
- Java 数据类型转化
目录 Java类型转化 基本数据类型自动类型转换 自动类型提升 强制类型转换 - 自动类型提升的逆运算 int与long int类型与String类型 int类型转换成String类型 方法1:+ 拼 ...
- HashMap有几种遍历方法?推荐使用哪种?
本文已收录<面试精选>系列,Gitee 开源地址:https://gitee.com/mydb/interview HashMap 的遍历方法有很多种,不同的 JDK 版本有不同的写法,其 ...
- acquaint
Interpersonal relationships are dynamic systems that change continuously during their existence. Lik ...
- Sharding-JDBC 简介
什么是Sharding-JDBC 1.是轻量级的 java 框架,是增强版的 JDBC 驱动2. Sharding-JDBC(1)主要目的是:简化对分库分表之后数据相关操作.不是帮我们做分库分表,而是 ...
- JTable 单元格合并 【转】
单元格合并 一.单元格合并.(1)我们可以使用Jtable的三个方法:getCellRect(),columnAtPoint(),and rowAtPoint().第一个方法返回一个单元格的边界(Re ...
- STM32 CAN用队列缓冲接收的例子
[1]CAN接收用队列缓冲的例子: 发单帧没有问题,多帧或者连续发两帧就有问题.
- [项目总结]论Android Adapter notifyDataSetChanged与notifyDataSetInvalidated无效原因
最近在开发中遇到一个问题,Adapter中使用notifyDataSetChanged 与notifyDataSetInvalidated无效,经过思考和网上查找,得出如下原因. 首先看一下notif ...
- Output of C++ Program | Set 4
Difficulty Level: Rookie Predict the output of below C++ programs. Question 1 1 #include<iostream ...
- Mysql的表级锁
我们首先需要知道的一个大前提是:mysql的锁是由具体的存储引擎实现的.所以像Mysql的默认引擎MyISAM和第三方插件引擎 InnoDB的锁实现机制是有区别的.可根据不同的场景选用不同的锁定机制. ...
- Linux服务器---drupal
Drupal Drupal为用户提供各种工具来管理网站,它可以帮助用户入门,建立自己的网站 1.下载drupal软件(https://www.drupal.org/project/drupal/rel ...