uva1658 admiral
费用流。
裸的拆点最小费用流,一跑就行。
核弹预警,为何wa20多发。build函数一定要返回true。。。。。。
太可怕了
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 5000 + 10 ;
const int maxm = 200000 + 10;
const int inf = 0x3f3f3f3f;
int g[maxn],v[maxm],nex[maxm],c[maxm],f[maxm],eid;
int n,m;
int id[maxn][2],vid,S,T;
int dist[maxn],pre[maxn];
bool inque[maxn];
queue<int> q; void addedge(int a,int b,int F,int C) {
v[eid]=b; f[eid]=F; c[eid]=C; nex[eid]=g[a]; g[a]=eid++;
v[eid]=a; f[eid]=0; c[eid]=-C; nex[eid]=g[b]; g[b]=eid++;
} bool build() {
memset(id,0,sizeof(id));
if(!(scanf("%d%d",&n,&m) && n && m)) return false;
memset(g,-1,sizeof(g)); eid=0; vid=0;
for(int i=1;i<=n;i++) {
id[i][0]=++vid;
id[i][1]=++vid;
addedge(id[i][0],id[i][1],1,0);
}
for(int i=1,u,v,w;i<=m;i++) {
scanf("%d%d%d",&u,&v,&w);
if(v!=1 && u!=n) addedge(id[u][1],id[v][0],1,w);
}
S=++vid;
T=++vid;
addedge(S,id[1][1],2,0);
addedge(id[n][0],T,2,0);
return true;
} bool SPFA() {
memset(dist,0x7f,sizeof(dist));
memset(inque,0,sizeof(inque));
memset(pre,0,sizeof(pre));
dist[S]=0;
q.push(S);
inque[S]=1;
int u;
while(!q.empty()) {
u=q.front(); q.pop();
inque[u]=0;
for(int i=g[u];~i;i=nex[i])
if(f[i] && dist[v[i]]>c[i]+dist[u]) {
dist[v[i]]=c[i]+dist[u];
pre[v[i]]=i;
if(!inque[v[i]]) {
q.push(v[i]);
inque[v[i]]=1;
}
}
}
return dist[T]<inf;
} int augment() {
int aug=inf,res=0;
for(int i=T;i!=S;i=v[pre[i]^1]) aug=min(aug,f[pre[i]]);
for(int i=T;i!=S;i=v[pre[i]^1]) {
f[pre[i]]-=aug;
f[pre[i]^1]+=aug;
res+=c[pre[i]]*aug;
}
return res;
} void solve() {
int res=0;
while(SPFA())
res+=augment();
printf("%d\n",res);
} int main() {
while(build()) solve();
return 0;
}
uva1658 admiral的更多相关文章
- UVA1658 Admiral 拆点法解决结点容量(路径不能有公共点,容量为1的时候) 最小费用最大流
/** 题目:UVA1658 Admiral 链接:https://vjudge.net/problem/UVA-1658 题意:lrj入门经典P375 求从s到t的两条不相交(除了s和t外,没有公共 ...
- UVa1658 Admiral(拆点法+最小费用流)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51253 [思路] 固定流量的最小费用流. 拆点,将u拆分成u1和u ...
- UVA1658:Admiral
题意:给定一个有向带权图,求两条不相交(无公共点)的路径且路径权值之和最小,路径由1到v 题解:这题的关键就在于每个点只能走一遍,于是我们想到以边换点的思想,用边来代替点,怎么代替呢? 把i拆成i和i ...
- 【HDU 6171】Admiral(搜索+剪枝)
多校10 1001 HDU 6171 Admiral 题意 目标状态是第i行有i+1个i数字(i=0-5)共6行.给你初始状态,数字0可以交换上一行最近的两个和下一行最近的两个.求20步以内到目标状态 ...
- uva 1658 Admiral (最小费最大流)
uva 1658 Admiral 题目大意:在图中找出两条没有交集的线路,要求这两条线路的费用最小. 解题思路:还是拆点建图的问题. 首先每一个点都要拆成两个点.比如a点拆成a->a'.起点和终 ...
- UVA - 1658 Admiral
3. C - Admiral 题意:给定v(3<=v<=1000)个节点,e(3<=e<=10000)条边的又向加权图,求1->v的两条不相交的路径,使得权和最小. 思路 ...
- UVALive - 6266 Admiral 费用流
UVALive - 6266 Admiral 题意:找两条完全不相交不重复的路使得权值和最小. 思路:比赛的时候时间都卡在D题了,没有仔细的想这题,其实还是很简单的,将每个点拆开,连一条容量为1,费用 ...
- Admiral(双向BFS + Hash)
Problem Description Suppose that you are an admiral of a famous naval troop. Our naval forces have g ...
- UVa(1658),Admiral,海军上将,拆点,MCMF
题目链接:https://uva.onlinejudge.org/external/16/1658.pdf 题意:求1到N的两条路(不能相交),距离和最小. 分析: 第一次做拆点,有点意思.刚开始一直 ...
随机推荐
- Python Generators vs Iterators
http://stackoverflow.com/questions/2776829/difference-between-python-generators-vs-iterators iterato ...
- Servlet实现web站点文件下载功能示例
前段时间事情比较多,导致二月份没有记录自己的学习情况.最近接触了servlet,参考韩老师的教程自己写了一个web站点文件下载的小项目,该项目中还加入了简单的反盗链技术. 1.首先创建一个Shared ...
- Django1.6添加comments应用的简单过程
今天尝试为自己开发的博客加上评论功能,查看Django的文档,发现1.6之后Django不再自带comments这个app了,下面是官方文档上的说明: Django’s comment framewo ...
- Linux多进行之fork
#include <unistd.h> //定义该函数 #include <sys/types.h> //定义函数的返回类型pid_t /* 功能:复制进程 参数:无 返回值: ...
- 二十、mysql mysqldump备份工具
.备份所有数据库 mysqldump -uroot -p --all-database > c:\all.sql 备份所有数据库到c盘下的all,sql文件 .备份某个数据库 mysqldump ...
- WebApi中帮助页Description的中文显示
转自:http://edi.wang/post/2013/10/28/auto-generate-help-document-aspnet-webapi 我选择Web API的一个重要原因就是因为可以 ...
- (转载)Cocos2dx-OpenGL ES2.0教程:纹理贴图(6)
在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ...
- hive-site.xml 参数设置
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="confi ...
- linux grep、find 命令详解
grep1.作用grep命令可以指定文件中搜索特定的内容,并将含有这些内容的行标准输出.grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权 ...
- 关于C语言的输入-scanf、gets、getchar、getch、getline
找工作刷题,重拾C语言,发现对键盘输入掌握很生疏,现总结各类输入函数使用方法和注意事项如下. 1.scanf("格式说明",变量地址列表) scanf("%s" ...