zoj 月赛
2015-07-26 22:46
344 查看
E题
View Code
/*Author :usedrose */ /*Created Time :2015/7/26 22:29:35*/ /*File Name :2.cpp*/ #include <cstdio> #include <iostream> #include <algorithm> #include <sstream> #include <cstdlib> #include <cstring> #include <climits> #include <vector> #include <string> #include <ctime> #include <cmath> #include <deque> #include <queue> #include <stack> #include <set> #include <map> #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) #define OK cout << "ok" << endl; #define o(a) cout << #a << " = " << a << endl #define o1(a,b) cout << #a << " = " << a << " " << #b << " = " << b << endl using namespace std; typedef long long LL; //最小费用最大流,求最大费用只需要取相反数,结果取相反数即可。 //点的总数为 N,点的编号 0~N-1 const int MAXN = 10000; const int MAXM = 100000; int n,m; int A[MAXN],B[MAXN],X[MAXN],Y[MAXN]; struct Edge { int to,next,cap,flow,cost; }edge[MAXM]; int head[MAXN],tol; int pre[MAXN],dis[MAXN]; bool vis[MAXN]; int N;//节点总个数,节点编号从0~N-1 void init(int n) { N = n; tol = 0; memset(head,-1,sizeof(head)); } 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) { 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 != -1;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; } //返回的是最大流, cost存的是最小费用 int minCostMaxflow(int s,int t,int &cost) { int flow = 0; cost = 0; while(spfa(s,t)) { int Min = INF; for(int i = pre[t];i != -1;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 != -1;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() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); cin.tie(0); ios::sync_with_stdio(false); while (cin >> n >> m) { int all = 0; init(n+2); int s = 0, t = n+1; for (int i = 1;i <= n; ++ i) { cin >> A[i] >> B[i]; if (A[i] > B[i]) addedge(s, i, A[i]-B[i], 0); else if (A[i] < B[i]) { addedge(i, t, B[i]-A[i], 0); all += (B[i] - A[i]); } } int u, v; for (int i = 0;i < m; ++ i) { cin >> u >> v; addedge(u, v, INF, 1); addedge(v, u, INF, 1); } int cost, ans; ans = minCostMaxflow(s, t, cost); if (ans < all) cout << -1 << endl; else cout << cost << endl; } return 0; }
View Code
相关文章推荐
- Java 解决FileInputStream读取中文时乱码的问题
- MarqueeTextview(跑马灯)
- Java开发中的23种设计模式详解(转)
- Java中的构造器
- php传值赋值与引用赋值
- TBB 学习笔记
- Android核心基础-6.Android 耗时操作
- 微信6.2.4版本更新:微信群可转让
- 变革之心——读后感
- UIScrollView的属性总结
- SQL SERVER学习杂记
- iOS app支付宝接口调用的一点总结(补充支付宝SDK&Demo下载地址)
- .9图的制作(也叫9妹图,因为图片格式是以.9结尾的)
- [知识点]SPFA算法
- 学习笔记——mybatis的sql拼接与log4j调试
- UI___UIImageView
- [转]MySQL5.6.22 安装
- myeclipse连接数据库遇到的几个问题
- [主席树 强制在线]ZOJ3888 Twelves Monkeys
- 02_创建Git仓库,克隆仓库,git add,git commit,git push,git pull,同行冲突,不同行冲突的结局方案,git mergetool的使用