题意:

有n个点和m条边,让你从1出发到n再从n回到1,不要求所有点都要经过,但是每条边只能走一次。边是无向边。

问最短的行走距离多少。

一开始看这题还没搞费用流,后来搞了搞再回来看,想了想建图不是很难,因为要保证每条边只能走一次,那么我们把边拆为两个点,一个起点和终点,容量是1,权重是这条路的长度。然后两个端点分别向起点连接容量是1权重是0的边,终点分别向两个端点连容量是1权重是0的边,从源点到1连容量为2权重为0的边,从n到汇点连容量为2权重为0的边。

#include<stdio.h>
#include<queue>
#define MAXN 55000
#define MAXM 20002*5
#define INF 0x3f3f3f3f
using namespace std;
//起点编号必须最小,终点编号必须最大
bool vis[MAXN]; //spfa中记录是否在队列里边
struct edge{
edge *next,*op; //op是指向反向边
int t,c,v; //t下一个点编号,c容量,v权值
}ES[MAXM],*V[MAXN]; //ES边静态邻接表,V点的编号
int N,M,S,T,EC=-; //S源点最小,T汇点最大,EC当前边数
int demond[MAXN],sp[MAXN],prev[MAXN]; //spSPFA中记录距离,prev记录上一个点路径
edge *path[MAXN]; //与prev同步记录,记录到上一条边
void addedge(int a,int b,int v,int c=INF){
edge e1={V[a],,b,c,v},e2={V[b],,a,,-v};
ES[++EC]=e1;V[a]=&ES[EC];
ES[++EC]=e2;V[b]=&ES[EC];
V[a]->op=V[b];V[b]->op=V[a];
}
void init(){
int n,m;
scanf("%d%d",&n,&m);
S=;T=n+m*+;
EC=-;
addedge(S,,,);
addedge(n,T,,);
int a,b,c;
for(int i=;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
addedge(a,n+i,,);
addedge(b,n+i,,);
addedge(n+m+i,a,,);
addedge(n+m+i,b,,);
addedge(n+i,n+m+i,c,);
}
}
bool SPFA(){
int u,v;
for(u=S;u<=T;u++){
sp[u]=INF;
}
queue<int>q;
prev[S]=-;
q.push(S);
sp[S]=;
vis[S]=;
while(!q.empty()){
u=q.front();
vis[u]=;
q.pop();
for(edge *k=V[u];k;k=k->next){
v=k->t;
if(k->c>&&sp[u]+k->v<sp[v]){
sp[v]=sp[u]+k->v;
prev[v]=u;
path[v]=k;
if(vis[v]==){
vis[v]=;
q.push(v);
}
}
}
}
return sp[T]!=INF;
}
int argument(){
int i,cost=INF,flow=;
edge *e;
for(i=T;prev[i]!=-;i=prev[i]){
e=path[i];
if(e->c<cost)cost=e->c;
}
for(int i=T;prev[i]!=-;i=prev[i]){
e=path[i];
e->c-=cost;e->op->c+=cost;
flow+=e->v*cost;
}
return flow;
}
int maxcostflow(){
int Flow=;
while(SPFA()){
Flow+=argument();
}
return Flow;
}
int main(){
init();
printf("%d\n",maxcostflow());
return ;
}

最新文章

  1. MySQL(Percona Server) 5.6 主从复制
  2. Apache伪静态在网站目录没有反斜杠后自动添加反斜杠
  3. JS面向对象逆向学习法,让难理解的统统一边去(1)~
  4. AFNetworking简单用法
  5. WEB服务器、应用程序服务器、HTTP服务器区别
  6. windows2003安全加固
  7. 【转】Android自动化测试之MonkeyRunner录制和回放脚本(四)
  8. OSPF理论总结
  9. ASP.NET WEB API 自定义模型校验过滤器
  10. 凡事预则立(Beta)
  11. FMDB的简单实用
  12. mysqldump命令使用
  13. ASP.NET WebApi OWIN 实现 OAuth 2.0(自定义获取 Token)
  14. vue-cli3使用webpack-spritesmith配置雪碧图
  15. JDK安装与环境配置——学习JAVA的准备工作
  16. 组建自己的局域网(可以将PC机实现为服务器)
  17. nodejs和ionic小助手
  18. MySQL使用AUTO_INCREMENT列的表注意事项之update自增列篇
  19. Ajax请求 一般处理程序参数传递的几种方式
  20. 洛谷P2114 [NOI2014]起床困难综合症

热门文章

  1. ajax重构XMLHttpRequest
  2. 阿里DNS
  3. java.lang.NoSuchMethodError: 属于jar包冲突
  4. Python基础教程【读书笔记】 - 2016/7/18
  5. Javascript 图片左右滑动与切换
  6. JS URL 使用base64加密与解密
  7. [platform]linux platform device/driver(二)--Platform Device和Platform_driver注册过程之详细代码
  8. RMAN_学习实验1_RMAN备份标准过程(案例)
  9. Accounting_权责发生制和收付实现值的区别(概念)
  10. apache 开启服务器包含(SSI)技术