HDU5294 Tricks Device(最大流+SPFA) 2015 Multi-University Training Contest 1
Tricks Device
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 389 Accepted Submission(s): 100
chambers. Innocent Wu wants to catch up Dumb Zhang to find out the answers of some questions, however, it’s Dumb Zhang’s intention to keep Innocent Wu in the dark, to do which he has to stop Innocent Wu from getting him. Only via the original shortest ways
from the entrance to the end of the tomb costs the minimum time, and that’s the only chance Innocent Wu can catch Dumb Zhang.
Unfortunately, Dumb Zhang masters the art of becoming invisible(奇门遁甲) and tricks devices of this tomb, he can cut off the connections between chambers by using them. Dumb Zhang wanders how many channels at least he has to cut to stop Innocent Wu. And Innocent
Wu wants to know after how many channels at most Dumb Zhang cut off Innocent Wu still has the chance to catch Dumb Zhang.
For each case,the first line must includes two integers, N(<=2000), M(<=60000). N is the total number of the chambers, M is the total number of the channels.
In the following M lines, every line must includes three numbers, and use ai、bi、li as channel i connecting chamber ai and bi(1<=ai,bi<=n), it costs li(0<li<=100) minute to pass channel i.
The entrance of the tomb is at the chamber one, the end of tomb is at the chamber N.
8 9 1 2 2 2 3 2 2 4 1 3 5 3 4 5 4 5 8 1 1 6 2 6 7 5 7 8 1
2 6
pid=5299" target="_blank">5299 5298
- #include<stdio.h>
- #include<string.h>
- #include<queue>
- #include<vector>
- #include<algorithm>
- using namespace std;
- #define captype int
- const int MAXN = 2010; //点的总数
- const int MAXM = 400010; //边的总数
- const int INF = 1<<30;
- struct EDG{
- int to,next;
- captype cap,flow;
- int d;
- } edg[MAXM];
- int eid,head[MAXN];
- int gap[MAXN]; //每种距离(或可觉得是高度)点的个数
- int dis[MAXN]; //每一个点到终点eNode 的最短距离
- int cur[MAXN]; //cur[u] 表示从u点出发可流经 cur[u] 号边
- int pre[MAXN];
- int D[MAXN], vist[MAXN], mindis;
- void init(){
- eid=0;
- memset(head,-1,sizeof(head));
- }
- //有向边 三个參数。无向边4个參数
- void addEdg(int u,int v,int d,captype rc=0){
- edg[eid].to=v; edg[eid].next=head[u]; edg[eid].d=d;
- edg[eid].cap=1; edg[eid].flow=0; head[u]=eid++;
- edg[eid].to=u; edg[eid].next=head[v]; edg[eid].d=INF;
- edg[eid].cap=rc; edg[eid].flow=0; head[v]=eid++;
- }
- captype maxFlow_sap(int sNode,int eNode, int n){//n是包含源点和汇点的总点个数,这个一定要注意
- memset(gap,0,sizeof(gap));
- memset(dis,0,sizeof(dis));
- memcpy(cur,head,sizeof(head));
- memset(vist,-1,sizeof(vist));
- pre[sNode] = -1;
- gap[0]=n;
- captype ans=0; //最大流
- vist[sNode]=0;
- int u=sNode ,i ;
- while(dis[sNode]<n){ //推断从sNode点有没有流向下一个相邻的点
- if(u==eNode){ //找到一条可增流的路
- captype Min=INF ;
- int inser;
- for( i=pre[u]; i!=-1; i=pre[edg[i^1].to]) //从这条可增流的路找到最多可增的流量Min
- if(Min>edg[i].cap-edg[i].flow){
- Min=edg[i].cap-edg[i].flow;
- inser=i;
- }
- for( i=pre[u]; i!=-1; i=pre[edg[i^1].to]){
- edg[i].flow+=Min;
- edg[i^1].flow-=Min; //可回流的边的流量
- }
- ans+=Min;
- u=edg[inser^1].to;
- continue;
- }
- bool flag = false; //推断是否能从u点出发可往相邻点流
- int v;
- for( i=cur[u]; i!=-1; i=edg[i].next){
- v=edg[i].to;
- if(edg[i].cap>0&&vist[u]+edg[i].d+D[v]!=mindis)//假设是正流,则必须保证是最短的一条路,假设是逆流。表明v点己是在最短路上
- continue;
- vist[v]=mindis-D[v];
- if( edg[i].cap-edg[i].flow>0 && dis[u]==dis[v]+1){
- flag=true;
- cur[u]=pre[v]=i;
- break;
- }
- }
- if(flag){
- u=v;
- continue;
- }
- //假设上面没有找到一个可流的相邻点。则改变出发点u的距离(也可觉得是高度)为相邻可流点的最小距离+1
- int Mind= n;
- for( i=head[u]; i!=-1; i=edg[i].next){
- v=edg[i].to;
- if(edg[i].cap>0&&vist[u]+edg[i].d+D[v]!=mindis)
- continue;
- vist[v]=mindis-D[v];
- if( edg[i].cap-edg[i].flow>0 && Mind>dis[v]){
- Mind=dis[v];
- cur[u]=i;
- }
- }
- gap[dis[u]]--;
- if(gap[dis[u]]==0) return ans; //当dis[u]这样的距离的点没有了,也就不可能从源点出发找到一条增广流路径
- //由于汇点到当前点的距离仅仅有一种,那么从源点到汇点必定经过当前点,然而当前点又没能找到可流向的点,那么必定断流
- dis[u]=Mind+1;//假设找到一个可流的相邻点,则距离为相邻点距离+1。假设找不到,则为n+1
- gap[dis[u]]++;
- if(u!=sNode) u=edg[pre[u]^1].to; //退一条边
- }
- return ans;
- }
- int numk[MAXN];
- void spfa(int s,int t,int n){
- queue<int>q;
- int inq[MAXN]={0},i;
- for( i=1; i<=n; i++)
- D[i]=INF;
- D[t]=0; numk[t]=0;
- q.push(t);
- while(!q.empty()){
- int u=q.front(); q.pop();
- inq[u]=0;
- for( i=head[u]; i!=-1; i=edg[i].next)
- if(edg[i].d==INF&&D[edg[i].to]>D[u]+edg[i^1].d){
- D[edg[i].to]=D[u]+edg[i^1].d;
- numk[edg[i].to]=numk[u]+1;
- if(inq[edg[i].to]==0)
- inq[edg[i].to]=1,q.push(edg[i].to);
- }
- else if(edg[i].d==INF&&D[edg[i].to]==D[u]+edg[i^1].d&&numk[edg[i].to]>numk[u]+1)
- {
- numk[edg[i].to]=numk[u]+1;
- if(inq[edg[i].to]==0)
- inq[edg[i].to]=1,q.push(edg[i].to);
- }
- }
- }
- int main()
- {
- int n,m,u,v,cost;
- while(scanf("%d%d",&n,&m)>0)
- {
- init();
- for(int i=1; i<=m; i++)
- {
- scanf("%d%d%d",&u,&v,&cost);
- addEdg(u,v,cost);
- addEdg(v,u,cost);
- }
- spfa(1,n,n);
- int ans1,ans2;
- ans2=m-numk[1];
- mindis=D[1];
- ans1=maxFlow_sap(1,n,n);
- printf("%d %d\n",ans1,ans2);
- }
- }
HDU5294 Tricks Device(最大流+SPFA) 2015 Multi-University Training Contest 1的更多相关文章
- HDU 5294 Tricks Device(多校2015 最大流+最短路啊)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Problem Description Innocent Wu follows Dumb Zha ...
- HDU 5294 Tricks Device (最大流+最短路)
题目链接:HDU 5294 Tricks Device 题意:n个点,m条边.而且一个人从1走到n仅仅会走1到n的最短路径.问至少破坏几条边使原图的最短路不存在.最多破坏几条边使原图的最短路劲仍存在 ...
- HDU5294——Tricks Device(最短路 + 最大流)
第一次做最大流的题目- 这题就是堆模板 #include <iostream> #include <algorithm> #include <cmath> #inc ...
- hdu 3572 Task Schedule(最大流)2010 ACM-ICPC Multi-University Training Contest(13)——Host by UESTC
题意: 告诉我们有m个任务和k个机器.第i个任务需要ci天完成,最早从第ai天开始,最晚在第bi天结束.每台机器每天可以执行一个任务.问,是否可以将所有的任务都按时完成? 输入: 首行输入一个整数t, ...
- Tricks Device (hdu 5294 最短路+最大流)
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) To ...
- SPFA+Dinic HDOJ 5294 Tricks Device
题目传送门 /* 题意:一无向图,问至少要割掉几条边破坏最短路,问最多能割掉几条边还能保持最短路 SPFA+Dinic:SPFA求最短路时,用cnt[i]记录到i最少要几条边,第二个答案是m - cn ...
- 2015 Multi-University Training Contest 1 Tricks Device
Tricks Device Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- HDOJ 5294 Tricks Device 最短路(记录路径)+最小割
最短路记录路径,同一时候求出最短的路径上最少要有多少条边, 然后用在最短路上的边又一次构图后求最小割. Tricks Device Time Limit: 2000/1000 MS (Java/Oth ...
- hdu 5294 Tricks Device 最短路建图+最小割
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...
随机推荐
- java_tcp_简单示例
package netProgram; import java.io.DataOutputStream; import java.io.IOException; import java.net.Ser ...
- js 随机生成颜色
方法一 function randomColor (){ var str='#'; for(var i=0;i<6;i++){ str+=Math.floor(Math.random()*16 ...
- linux nslookup-查询域名DNS信息的工具
博主推荐:更多网络测试相关命令关注 网络测试 收藏linux命令大全 nslookup命令是常用域名查询工具,就是查DNS信息用的命令. nslookup4有两种工作模式,即“交互模式”和“非交互模 ...
- 字符串str.format()方法的个人整理
引言: 字符串的内置方法大致有40来个,但是一些常用的其实就那么20几个,而且里面还有类似的用法,区分度高比如isalpha,isalnum,isdigit,还有一些无时不刻都会用到的split切分, ...
- 集训第六周 数学概念与方法 数论 线性方程 I题
Description The Sky is Sprite. The Birds is Fly in the Sky. The Wind is Wonderful. Blew Throw the Tr ...
- 集训第四周(高效算法设计)B题 (二分查找优化题)
---恢复内容开始--- Description Before the invention of book-printing, it was very hard to make a copy of ...
- 腾讯ISUX网站的一个小问题
腾讯isux网站的一个小问题. 它的网站:http://isux.tencent.com/?variant=zh-hans 优秀的网站和差的网站的距离往往就在于细节. 浏览环境:谷歌. ...
- [codevs4655] 序列终结者(Splay)
传送门 支持操作: 1.区间加 2.区间翻转 3.区间求最大值 splay模板 注意:update 里更新 max 时需要取 3 个值的 Max 别忘了各种边界讨论 ——代码 #include < ...
- 变量&字符串
变量 变量定义规范: # 声明变量: name = "Neo Zheng" # name为变量名(标识符),"Neo Zheng"是变量值. 变量定义规则: 1 ...
- 关于PHP include文件时的文件查找顺序
常常被include文件的路径搞晕. 看来是要理一理的时候了. PHP官方文档关于include搜索路径的解释是:先查找工作目录下相对于include_path设置所对应的路径,然后再搜索执行文件所在 ...