博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uva 10806
阅读量:6164 次
发布时间:2019-06-21

本文共 1401 字,大约阅读时间需要 4 分钟。

最小费用,最大流的思想,也不知道怎么稀里糊涂就ac啦

#include 
#include
#include
using namespace std;const int maxn=102;const int inf=2<<20;int cost[maxn][maxn],flow[maxn][maxn],cap[maxn][maxn],d[maxn];int n,m;int solve(){ queue
q; int i,vis[maxn],p[maxn],tot=0; while(1) { for(i=1;i<=n+1;i++) { d[i]=i==1?0:inf; vis[i]=0; } q.push(1); int x; while(!q.empty()) { x=q.front(); q.pop(); vis[x]=0; for(i=1;i<=n+1;i++) { if(cap[x][i]>flow[x][i]&&d[i]>d[x]+cost[x][i]) { d[i]=d[x]+cost[x][i]; p[i]=x; if(!vis[i]) { vis[i]=1; q.push(i); } } } } if(d[n+1]==inf) break; int min=inf; for(i=n+1;i!=1;i=p[i]) { if(min>(cap[p[i]][i])-flow[p[i]][i]) min=cap[p[i]][i]-flow[p[i]][i]; } for(i=n+1;i!=1;i=p[i]) { flow[p[i]][i]+=min; flow[i][p[i]]-=min;cost[i][p[i]]=-cost[i][p[i]]; } tot+=min*d[n+1]; if(flow[n][n+1]==2) return tot; } return -1;}int main(){ while(cin>>n&&n!=0) { cin>>m; int i; int tu,tv,tw; memset(flow,0,sizeof(flow)); memset(cost,inf,sizeof(cost)); memset(cap,0,sizeof(cap)); for(i=1;i<=m;i++) { cin>>tu>>tv>>tw; cost[tu][tv]=tw;cap[tu][tv]=1; cost[tv][tu]=tw;cap[tv][tu]=1; } cap[n][n+1]=2;cost[n][n+1]=cost[n+1][n]=0; int ou=solve(); if(ou!=-1) cout<
<

 

转载于:https://www.cnblogs.com/lj-vs-lishimin/archive/2012/11/08/2774366.html

你可能感兴趣的文章
爬虫豆瓣top250项目-开发文档
查看>>
有趣的数学书籍
查看>>
teamviewer 卸载干净
查看>>
eclipse的maven、Scala环境搭建
查看>>
架构师之路(一)- 什么是软件架构
查看>>
USACO 土地购买
查看>>
【原创】远景能源面试--一面
查看>>
B1010.一元多项式求导(25)
查看>>
10、程序员和编译器之间的关系
查看>>
配置 RAILS FOR JRUBY1.7.4
查看>>
修改GRUB2背景图片
查看>>
Ajax异步
查看>>
好记性不如烂笔杆-android学习笔记<十六> switcher和gallery
查看>>
JAVA GC
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
图解SSH原理及两种登录方法
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JS图片跟着鼠标跑效果
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>