【费用流】 HDU 1853 Cyclic Tour 费用流 完备匹配(裸题)
来源:互联网 发布:影像测量仪软件 编辑:程序博客网 时间:2024/06/07 06:00
n个城市m条街道 要求完全匹配
#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <iostream>#include <algorithm>#include <sstream>#include <cmath>using namespace std;#include <queue>#include <stack>#include <vector>#include <deque>#include <set>#include <map>#include <time.h>;#define cler(arr, val) memset(arr, val, sizeof(arr))#define FOR(i,a,b) for(int i=a;i<=b;i++)#define IN freopen ("in.txt" , "r" , stdin);#define OUT freopen ("out.txt" , "w" , stdout);typedef long long LL;const int MAXN = 500;const int MAXM = 100000;const int INF = 0x3f3f3f3f;//const int INF = 922222;const int mod = 1000000007;struct Edge{ int to,next,cap,flow,cost;} edge[MAXM];int head[MAXN],tol;int pre[MAXN],dis[MAXN];bool vis[MAXN];void init(){ tol=0; cler(head,-1);}void addedge(int u,int v,int cap,int cost){ edge[tol].to=v; edge[tol].cap=cap; edge[tol].cost=cost; edge[tol].flow=0; edge[tol].next=head[u]; head[u]=tol++; edge[tol].to=u; edge[tol].cap=0; edge[tol].cost=-cost; edge[tol].flow=0; edge[tol].next=head[v]; head[v]=tol++;}bool spfa(int s,int t,int n){ queue<int>q; for(int i=0; i<n; i++) { dis[i]=INF; vis[i]=false,pre[i]=-1; } dis[s]=0; vis[s]=true; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=false; for(int i=head[u]; ~i; i=edge[i].next) { int v=edge[i].to; if(edge[i].cap>edge[i].flow&&dis[v]>dis[u]+edge[i].cost) { dis[v]=dis[u]+edge[i].cost; pre[v]=i; if(!vis[v]) { vis[v]=true; q.push(v); } } } } if(pre[t]==-1) return false; else return true;}int mincostmaxflow(int s,int t,int n,int &cost){ int flow=0; cost=0; while(spfa(s,t,n)) { int Min = INF; for(int i=pre[t]; ~i; i=pre[edge[i^1].to]) { if(Min>edge[i].cap-edge[i].flow) Min=edge[i].cap-edge[i].flow; } for(int i=pre[t]; ~i; i=pre[edge[i^1].to]) { edge[i].flow+=Min; edge[i^1].flow-=Min; cost+=edge[i].cost*Min; } flow+=Min; } return flow;}int main(){#ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout);#endif int n,m; while(scanf("%d%d",&n,&m)!=EOF) { init(); int u,v,d; for(int i=0; i<m; i++) { scanf("%d%d%d",&u,&v,&d); addedge(u,v+n,1,d); } for(int i=1; i<=n; i++) { addedge(0,i,1,0); addedge(i+n,2*n+1,1,0); } int cost; if(mincostmaxflow(0,2*n+1,2*n+2,cost)==n) printf("%d\n",cost); else puts("-1"); } return 0;}
0 0
- 【费用流】 HDU 1853 Cyclic Tour 费用流 完备匹配(裸题)
- hdu 1853 Cyclic Tour(最小权匹配/费用流)
- HDU 1853 Cyclic Tour //费用流
- hdu Cyclic Tour 1853 费用流
- HDU 1853 Cyclic Tour(最小费用流)
- HDU 1853 Cyclic Tour 费用流
- hdu 1853 Cyclic Tour 费用流
- HDU 1853 Cyclic Tour && HDU 3488Tour 最小费用流
- hdu 1853 Cyclic Tour(费用流,判断满流)
- HDU 1853 Cyclic Tour 费用流(圈)
- HDU 1853 Cyclic Tour(最小费用最大流)
- HDU 1853 Cyclic Tour(最小费用流)
- hdu 1853 Cyclic Tour(费用流OR二分图最佳匹配,5级)
- HDU 1853 Cyclic Tour【最小费用最大流 OR 带权二分图匹配】
- Hdu 1853 Cyclic Tour - 最小费用最大流
- Cyclic Tour hdu 1853 最小费用最最大流
- hdu 1853 Cyclic Tour(最小费用最大流)
- hdu 1853 Cyclic Tour 最小费用最大流
- 第十八章 18.1.3节练习 & 18.1.4节练习
- 异常
- Java 对象序列化机制详解
- CRC英文维基百科
- cookie和session的总结
- 【费用流】 HDU 1853 Cyclic Tour 费用流 完备匹配(裸题)
- RuntimeExcetion
- Could not create the view: An unexpected exception was thrown. 电脑突然断电,myeclipse非正常关闭,出现错误
- matlab中repmat函数的用法
- 开始学习Linux操作系统了
- 内部类
- 安卓程序基本结构分析
- 理解Android的Http协议
- 实现字符串的查找和替换