菜鸟物流有自己的运输网络,网络中包含 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≤​2​​n(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)的更多相关文章

  1. 计蒜客 作弊揭发者(string的应用)

    鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统.当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字.字母序列识别车牌,通过连接车管所车辆信息数据库 ...

  2. 计蒜客的一道题dfs

    这是我无聊时在计蒜客发现的一道题. 题意: 蒜头君有一天闲来无事和小萌一起玩游戏,游戏的内容是这样的:他们不知道从哪里找到了N根不同长度的木棍, 看谁能猜出这些木棍一共能拼出多少个不同的不等边三角形. ...

  3. 计蒜客模拟赛5 D2T1 成绩统计

    又到了一年一度的新生入学季了,清华和北大的计算机系同学都参加了同一场开学考试(因为两校兄弟情谊深厚嘛,来一场联考还是很正常的). 不幸的是,正当老师要统计大家的成绩时,世界上的所有计算机全部瘫痪了. ...

  4. 计蒜客 等边三角形 dfs

    题目: https://www.jisuanke.com/course/2291/182238 思路: 1.dfs(int a,int b,int c,int index)//a,b,c三条边的边长, ...

  5. 计蒜客 方程的解数 dfs

    题目: https://www.jisuanke.com/course/2291/182237 思路: 来自:https://blog.csdn.net/qq_29980371/article/det ...

  6. 计蒜客 买书 dfs

    题目: https://www.jisuanke.com/course/2291/182236 思路: 递归解决,从第一本书开始,每本书都有两种选择: //index是book里面每本书价格的下标, ...

  7. 计蒜客:Entertainment Box

    Ada, Bertrand and Charles often argue over which TV shows to watch, and to avoid some of their fight ...

  8. 爬虫acm比赛成绩(多页成绩整合在一起、获取复制不了的数据)(hihocoder、计蒜客)

    https://github.com/congmingyige/web-crawler_rank-of-competition-in-JiSuanKe-and-hihocoder 1. 计蒜客(获取复 ...

  9. 计蒜客 31436 - 提高水平 - [状压DP]

    题目链接:https://nanti.jisuanke.com/t/31436 作为一名车手,为了提高自身的姿势水平,平时的练习是必不可少的.小 J 每天的训练包含 $N$ 个训练项目,他会按照某个顺 ...

随机推荐

  1. Identity Server 4 从入门到落地(三)—— 创建Web客户端

    书接上回,我们已经搭建好了基于Identity Server 4的认证服务和管理应用(如果还没有搭建,参看本系列前两部分,相关代码可以从github下载:https://github.com/zhen ...

  2. 巩固javaweb的第二十一天

    巩固内容:对输入信息进行验证 JavaScript 语言 在 Web 应用中需要在客户端执行的功能可以使用 JavaScript 语言编写,在使用的时候 需要把 JavaScript 代码放在下面的两 ...

  3. IT四大名著

    标题耸人听闻,sorry. CPU.操作系统.编译器和数据库我都不会.我英语也不行,但我认识所有的字母.:-) 万一有人感兴趣呢?https://sqlite.org/doclist.htmlThe ...

  4. Web安全学习二

    目录 常见漏洞攻防 SQL注入 注入分类 按技巧分类 按获取数据的方式分类 注入检测 权限提升 数据库检测 绕过技巧 CheatSheet SQL Server Payload MySQL Paylo ...

  5. oracle加密encrypt,解密decrypt

    目录 oracle加密encrypt,解密decrypt 加密 解密 oracle加密encrypt,解密decrypt 有的oracle版本没有加解密函数,以下操作可以手动添加 oracle数据使用 ...

  6. 11-如何通过newman生成不同类型的测试报告

    postman生成测试报告需要一个插件:newman ,并且这个插件需要先安装 . 安装步骤: 安装nodejs: newman是由nodejs开发,所以要先安装它的运行环境,下载地址:http:// ...

  7. java中super的几种用法,与this的区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位. class Base { Base() { System.out.println("Base"); ...

  8. OpenStack之三: 安装MySQL,rabbitmq, memcached

    官网地址:https://docs.openstack.org/install-guide/environment-sql-database-rdo.html #:安装mysql [root@mysq ...

  9. spring-dm 一个简单的实例

    spring-dm2.0  运行环境,支持JSP页面 运行spring web 项目需要引用包

  10. vue 键盘事件keyup/keydoen

    使用: <!DOCTYPE html> <html> <head> <title></title> <meta charset=&qu ...