1. 菜鸟物流的运输网络

菜鸟物流有自己的运输网络,网络中包含 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

思路:

题目描述以及数据范围很爆做法。

很显然一道拆点网络流问题。

那么如何考虑从u到v一定经过mid这个点呢?

我们不妨从mid出发,找一条从mid到u的路径,再找一条从mid到v的路径,将其合并即可。

那么我们建图方式也就很简单了:

①设定源点,将其连入mid这个点,流为2.

②设定汇点,将u和v两个点连入汇点,流为1.

③对于输入的无向边,我们将其连入,流为INF.

④然后拆点,除了mid这个点之外,每个点i拆出来一个点i+n,然后从i到i+n建一条边,流为1

然后建好图之后跑完网络流之后,我们直接O(nm)倒序查询路径即可。

查询路径过程我们直接访问退回边的信息就行了。

Ac代码:

#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
struct node
{int from;int to;int w;int next;
}e[1500000];
int cur[1500];
int divv[1500];
int head[1500];
int n,m,cont;
int tmpx,tmpy,tmpz,ss,tt;
void add(int from,int to,int w)
{e[cont].from=from;e[cont].to=to;e[cont].w=w;e[cont].next=head[from];head[from]=cont++;
}
void Getmap()
{cont=0;memset(head,-1,sizeof(head));ss=n*2+1;tt=ss+1;add(ss,tmpz,2);add(tmpz,ss,0);for(int i=1;i<=n;i++){if(i==tmpz){add(i,i+n,2);add(i+n,i,0);continue;}add(i,i+n,1);add(i+n,i,0);if(i==tmpx||i==tmpy){add(i+n,tt,1);add(tt,i+n,0);}}for(int i=0;i<m;i++){int u,v;scanf("%d%d",&u,&v);add(u+n,v,0x3f3f3f3f);add(v,u+n,0);add(v+n,u,0x3f3f3f3f);add(u,v+n,0);}
}
int makedivv()
{queue<int >s;s.push(ss);memset(divv,0,sizeof(divv));divv[ss]=1;while(!s.empty()){int u=s.front();if(u==tt)return 1;s.pop();for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].to;int w=e[i].w;if(w&&divv[v]==0){divv[v]=divv[u]+1;s.push(v);}}}return 0;
}
int Dfs(int u,int maxflow,int tt)
{int ret=0;if(u==tt)return maxflow;for(int &i=cur[u];i!=-1;i=e[i].next){int v=e[i].to;int w=e[i].w;if(w&&divv[v]==divv[u]+1){int f=Dfs(v,min(maxflow-ret,w),tt);e[i].w-=f;e[i^1].w+=f;ret+=f;if(ret==maxflow)return ret;}}return ret;
}
void Dinic()
{while(makedivv()==1){memcpy(cur,head,sizeof(head));Dfs(ss,0x3f3f3f3f,tt);}
}
void Slove()
{queue<int >ans;int now=tmpx;while(1){if(now<=n&&now>=1){//printf("%d\n",now);ans.push(now);}int pos=-1;for(int i=0;i<cont;i++){if(e[i].to==now){if(e[i^1].w>0){pos=e[i].from;break;}}}if(pos==ss)break;now=pos;}now=tmpy;stack<int >ans2;while(1){if(now<=n&&now>=1){//printf("%d\n",now);ans2.push(now);}int pos=-1;for(int i=0;i<cont;i++){if(e[i].to==now){if(e[i^1].w>0){pos=e[i].from;break;}}}if(pos==tmpz)break;now=pos;}int flag=0;while(!ans.empty()){if(flag>0)printf(" ");printf("%d",ans.front());ans.pop();flag++;}while(!ans2.empty()){if(flag>0)printf(" ");printf("%d",ans2.top());ans2.pop();flag++;}printf("\n");/*for(int i=0;i<cont;i++){if(e[i].to==8&&e[i].from==3){printf("%d\n",e[i^1].w);}}*/
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);scanf("%d%d%d",&tmpx,&tmpy,&tmpz);Getmap();Dinic();Slove();}
}

2016 计蒜之道 复赛 菜鸟物流的运输网络【拆点+思维建图+网络流】相关推荐

  1. 2016计蒜之道复赛 微信钱包付款

    2016计蒜之道复赛  微信钱包付款 一.题意: 微信钱包付款 给定n(0≤n≤10​10000),求a,,b,c使得a+b+c=n,并且f(a)=f(b)=f(c),f(n)定义为n的各数位的和,例 ...

  2. 2016 计蒜之道 初赛 第五场

    2016 计蒜之道 初赛 第五场 腾讯推出了一款新游戏:勇者的故事.在游戏里有一个勇者,要去挑战大魔王.大魔王有 nnn 支护卫队,第 iii 支护卫队里有 mim_im​i​​ 只恶魔.勇者和恶魔都 ...

  3. 2019年第五届计蒜之道复赛总结

    又是一年计蒜客,沙雕ACMer欢乐多 热心市民yzm10按捺不住冲动,在期末期间又打了一场比赛. 赛点:204(与罚时惊人的相似) 做完两题排在一百多名,以为稳了(其实后面做不动了)比到一半就开始挂机 ...

  4. 2018 计蒜之道 复赛

    A. 贝壳找房函数最值 常规贪心推式子.按(a-1)/b排序 #include <bits/stdc++.h> #define rep(i,a,b) for(int i=a;i<=b ...

  5. 2016 计蒜之道 初赛 第二场 联想公司的 logo 设计(计蒜客)

    题目: 输入输出说明: 输入输出样例: #include <stdio.h> #include <math.h> #define PI 3.1415926535898 int ...

  6. 2016 计蒜之道 初赛 第一场 青云的服务器密钥

    青云给每台服务器设置了一个由小写字母a-z组成的密钥.密钥的易破解程度定义如下: 对于密钥 S1..SnS_1..S_nS​1​​..S​n​​,我们需要首先计算其对应的π\piπ 数组.对于任意的 ...

  7. 2016计蒜之道初赛第一场----A青云的服务器密钥【贪心】

    青云给每台服务器设置了一个由小写字母a-z组成的密钥.密钥的易破解程度定义如下: 对于密钥 S_1..S_nS​1​​..S​n​​,我们需要首先计算其对应的 \piπ 数组.对于任意的 i(2 \l ...

  8. 2019 计蒜之道 复赛 “星云系统” 贪心

    题目链接:https://nanti.jisuanke.com/t/39614 题解:首先把每个字符的位置保存下来,然后很容易就想到二分去做,但是T了,所以我们就可以O(n)去做,记录下位置后,直接枚 ...

  9. 2019 计蒜之道 复赛 撑起信息安全“保护伞” 贪心

    题目链接:https://nanti.jisuanke.com/t/39615 题解:两种都从后往前,l记录左括号的数量,r记录右括号数量,找前驱时,要满足第一个符合的s[i]==')' && ...

最新文章

  1. SpringMVC框架 学习DAY_02 : 接收请求参数/向模板页面转发数据/重定向与转发 /Session
  2. 这100道面试题,用来忽悠半吊子面试官
  3. 纳米颗粒C语言数值模拟_J.Hazard. Mater.当“金属纳米酶”邂逅“重金属离子”:机遇与挑战...
  4. spark学习-Spark算子Transformations和Action使用大全(Transformations章(二))
  5. PRML笔记:模式识别与机器学习
  6. 《卫星通信》课程大作业——基于MATLAB的无线通信链路级仿真
  7. 判断一颗二叉树是否为二叉平衡树 python 代码
  8. 计算机图形学(九)-纹理的应用,环境贴图、凹凸贴图、法线贴图、位移贴图
  9. 软件测试整理:测试设计
  10. 吴恩达深度学习笔记——优化算法
  11. android应用市场 更新,当贝市场(com.dangbeimarket) - 4.2.9 - 应用 - 酷安
  12. 多智能体强化学习:基本概念,通信方式,IPPO,MADDPG
  13. 惊了,Python 民俗社会科学项目,看看能否预测【面向哪里写BUG少】
  14. 手把手 教你如何做网线接头
  15. 欧拉定理学习20161004
  16. 模式识别的一些基本概念
  17. 生命不息,折腾不止——新的起点
  18. python京东自动签到_Python 实现京东自动签到领京豆
  19. FREE NAS服务器安装与配置使用
  20. HITCSAPP大作业——程序人生

热门文章

  1. 新日asp系统是什么_新日旗舰8代
  2. 诸葛亮军事上最大的本事就是打败仗
  3. KNN实现手写数字识别Python
  4. linux 的软连接创建删除
  5. Mixly09:呼吸灯
  6. 手机呼吸灯挺实用的,为什么很多手机没有了?你知道原因吗
  7. Python-Django毕业设计驾校预约系统小程序(程序+Lw)
  8. 爬虫简单爬取网站信息
  9. airpods替代耳机,比airpods好的耳机!
  10. 苹果 AirPods 耳机总是连到别人的iPhone,如何解决?