War(最短路+最大流)
War
http://acm.hdu.edu.cn/showproblem.php?pid=3599
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1870    Accepted Submission(s): 442
Yunfeng, the General of the army, must tell how many optimal ship routes are there to the king as soon as possible, or he will be killed. Now he asks for your help. You must help Yunfeng to save his life.
He tells you that there are N island. The islands are numbered from 1 to N(1 is Bangzi and N is Nebir, others are many islands). And there are many ways, each way contain the islands number U and V and the length W. Please output your answer.
Each case contains a number N (N<=1500) means the number of the islands.
And then many lines follow. Each line contains three numbers: U V W (W<10000), means that the distance between island U and V is W. The input of ways are terminated by “ 0 0 0 ”.
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#define INF 0x3f3f3f3f
#define maxn 2005
#define MAXN 1000005
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std; int n;
struct sair{
int len,pos;
bool operator<(const sair &b)const{
return len>b.len;
}
};
int dis[maxn];
int vis[maxn];
vector<pair<int,int> >ve[maxn];
void Dijstra(){
priority_queue<sair>q;
sair tmp;
tmp.len=,tmp.pos=;
dis[]=;
q.push(tmp);
while(!q.empty()){
tmp=q.top();
q.pop();
int pos=tmp.pos;
if(vis[pos]){
continue;
}
vis[pos]=;
for(int i=;i<ve[pos].size();i++){
int f=ve[pos][i].first;
int len=ve[pos][i].second; if(dis[f]>dis[pos]+len){
dis[f]=dis[pos]+len;
tmp.pos=f;
tmp.len=dis[f];
q.push(tmp);
}
}
}
} struct Edge{
int v,next;
int cap,flow;
}edge[MAXN*];//注意这里要开的够大。。不然WA在这里真的想骂人。。问题是还不报RE。。
int cur[MAXN],pre[MAXN],gap[MAXN],path[MAXN],dep[MAXN];
int cnt=;//实际存储总边数
void isap_init()
{
cnt=;
memset(pre,-,sizeof(pre));
}
void isap_add(int u,int v,int w)//加边
{
edge[cnt].v=v;
edge[cnt].cap=w;
edge[cnt].flow=;
edge[cnt].next=pre[u];
pre[u]=cnt++;
}
void add(int u,int v,int w){
isap_add(u,v,w);
isap_add(v,u,);
}
bool bfs(int s,int t)//其实这个bfs可以融合到下面的迭代里,但是好像是时间要长
{
memset(dep,-,sizeof(dep));
memset(gap,,sizeof(gap));
gap[]=;
dep[t]=;
queue<int>q;
while(!q.empty()) q.pop();
q.push(t);//从汇点开始反向建层次图
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=pre[u];i!=-;i=edge[i].next)
{
int v=edge[i].v;
if(dep[v]==-&&edge[i^].cap>edge[i^].flow)//注意是从汇点反向bfs,但应该判断正向弧的余量
{
dep[v]=dep[u]+;
gap[dep[v]]++;
q.push(v);
//if(v==sp)//感觉这两句优化加了一般没错,但是有的题可能会错,所以还是注释出来,到时候视情况而定
//break;
}
}
}
return dep[s]!=-;
}
int isap(int s,int t)
{
if(!bfs(s,t))
return ;
memcpy(cur,pre,sizeof(pre));
//for(int i=1;i<=n;i++)
//cout<<"cur "<<cur[i]<<endl;
int u=s;
path[u]=-;
int ans=;
while(dep[s]<n)//迭代寻找增广路,n为节点数
{
if(u==t)
{
int f=INF;
for(int i=path[u];i!=-;i=path[edge[i^].v])//修改找到的增广路
f=min(f,edge[i].cap-edge[i].flow);
for(int i=path[u];i!=-;i=path[edge[i^].v])
{
edge[i].flow+=f;
edge[i^].flow-=f;
}
ans+=f;
u=s;
continue;
}
bool flag=false;
int v;
for(int i=cur[u];i!=-;i=edge[i].next)
{
v=edge[i].v;
if(dep[v]+==dep[u]&&edge[i].cap-edge[i].flow)
{
cur[u]=path[v]=i;//当前弧优化
flag=true;
break;
}
}
if(flag)
{
u=v;
continue;
}
int x=n;
if(!(--gap[dep[u]]))return ans;//gap优化
for(int i=pre[u];i!=-;i=edge[i].next)
{
if(edge[i].cap-edge[i].flow&&dep[edge[i].v]<x)
{
x=dep[edge[i].v];
cur[u]=i;//常数优化
}
}
dep[u]=x+;
gap[dep[u]]++;
if(u!=s)//当前点没有增广路则后退一个点
u=edge[path[u]^].v;
}
return ans;
}
struct Bian{
int x,y,v;
}B[MAXN]; int main(){ std::ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--){
cin>>n;
for(int i=;i<=n;i++){
dis[i]=INF;
vis[i]=;
}
for(int i=;i<=n;i++){
ve[i].clear();
}
int a,b,c;
int j;
int co=;
while(cin>>B[co].x>>B[co].y>>B[co].v){
if(!B[co].x&&!B[co].y&&!B[co].v){
break;
}
ve[B[co].x].push_back(make_pair(B[co].y,B[co].v));
ve[B[co].y].push_back(make_pair(B[co].x,B[co].v));
co++;
}
Dijstra();
isap_init();
if(dis[n]==INF||n==){
cout<<<<endl;
continue;
}
for(int i=;i<co;i++){///判断是不是最短路上的边
if(dis[B[i].x]-dis[B[i].y]==B[i].v){
add(B[i].y,B[i].x,);
}
else if(dis[B[i].y]-dis[B[i].x]==B[i].v){
add(B[i].x,B[i].y,);
}
}
int s=,t=n;
int ans=isap(s,t);
cout<<ans<<endl;
} }
War(最短路+最大流)的更多相关文章
- hdu5294||2015多校联合第一场1007 最短路+最大流
		http://acm.hdu.edu.cn/showproblem.php? pid=5294 Problem Description Innocent Wu follows Dumb Zhang i ... 
- BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )
		最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ... 
- 【最短路+最大流】上学路线@安徽OI2006
		目录 [最短路+最大流]上学路线@安徽OI2006 PROBLEM SOLUTION CODE [最短路+最大流]上学路线@安徽OI2006 PROBLEM 洛谷P4300 SOLUTION 先在原图 ... 
- P3376 【模板】网络最大流——————Q - Marriage Match IV(最短路&最大流)
		第一道题是模板题,下面主要是两种模板,但都用的是Dinic算法(第二个题也是) 第一题: 题意就不需要讲了,直接上代码: vector代码: 1 //invalid types 'int[int]' ... 
- 【BZOJ-3931】网络吞吐量       最短路 + 最大流
		3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1228 Solved: 524[Submit][Stat ... 
- hdu3416 最短路+最大流
		题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就 ... 
- HDU 5294 Tricks Device 最短路+最大流
		题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5294 题意: 给你个无向图: 1.求最少删除几条边就能破坏节点1到节点n的最短路径, 2.最多能删除 ... 
- SGU 185 Two shortest  最短路+最大流
		题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21068 Yesterday Vasya and Petya qua ... 
- O - Marriage Match IV - hdu 3416(最短路+最大流)
		题目大意:在城市A的男孩想去城市B的女孩,不过他去城市B必须走最短路,并且走过的路不可以再走,问他最多能看这个女孩多少次. 分析:因为这个男孩直走最短路,所以我们必须求出来所有最短路径上的路,怎么 ... 
随机推荐
- PHP-Socket服务端客户端发送接收通信实例详解
			原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://fighter.blog.51cto.com/1318618/1533957 So ... 
- Hibernate   零散知识点
			1 get方法和load方法查询时的区别: 如果在缓存中没有找到相应的对象,get会直接访问数据库并返回一个完全初始化的对象,过程中可能涉及多次数据库调用:而load会返回一个代理对象,只有在对象ge ... 
- iOS TTF文件改变字体
			TTF(True Type Font):是一种字库名称 TTF文件:是Apple公司和Microsoft公司共同推出的字体文件格式 使用: 1 获取字体文件 从各种渠道下载字体ttf,网站或从别的ip ... 
- 【Linux_Unix系统编程】Chapter4 文件IO
			Chapter4 文件IO 4.1 概述 文件描述符 == Windows的句柄 标准文件描述符: 0 标准输入 STDIN_FILENO stdin 1 标准输出 STDOUT_FILENO std ... 
- 解决npm下载包失败的问题
			在我朝,用npm直接从官方的镜像下载包,经常会出现网络超时下载失败的问题,具体原因大家都懂,我就不说了. 不过,这些都无法阻挡我们对知识的渴望,一下提供几种我在工作中的解决办法,希望能帮助你. 1.安 ... 
- 伯克利、OpenAI等提出基于模型的元策略优化强化学习
			基于模型的强化学习方法数据效率高,前景可观.本文提出了一种基于模型的元策略强化学习方法,实践证明,该方法比以前基于模型的方法更能够应对模型缺陷,还能取得与无模型方法相近的性能. 引言 强化学习领域近期 ... 
- Deep Reinforcement Learning 基础知识
			Introduction 深度增强学习Deep Reinforcement Learning是将深度学习与增强学习结合起来从而实现从Perception感知到Action动作的端对端学习的一种全新的算 ... 
- 开发组件:ZeroMQ
			ZeroMQ https://blog.csdn.net/w174504744/article/details/73187697 
- orm 小结
			1. 销售注册,登录系统 - 用户表 2.销售添加客户信息,成为销售的私户 - 客户表 3. 销售固定时间跟进客户 - 跟进记录表 4. 客户报名 - 报名记录表 - 班级表(必须 ... 
- openx  ————带整理
			the initialisation file 初始化文件 Security check 安全检查 /work/puti-api-1.0/www/adapi/lib/OA/Admin/ ... 
