UESTC OJ1220(最短路)
2015-10-26 23:42
309 查看
南阳CCPC的F题,题意是有m个战场,n个小镇,曹操可以在第i个小镇调人到x[i]战场,每个人花费c[i]金钱,同时袁绍也会在第i个小镇调同等数量的人到y[i]战场。每个战场有重要程度分别为0,1,2 。2表示战场上曹操的人必须比袁绍多,1表示曹操的人必须大于等于袁绍,0表示没有限制。问满足条件曹操必须至少花费多少。
首先建模,只需要保证每个重要战场曹操的人数多一个就行,那么对于每个小镇,从y[i]连过来一条费用为0的边,向x[i]连一条费用为c[i]的边,建立一个超级源点连向所有的不重要战场。把所有的重要战场的最短路加起来就是答案。
注意INF需要开到10^10以上。
首先建模,只需要保证每个重要战场曹操的人数多一个就行,那么对于每个小镇,从y[i]连过来一条费用为0的边,向x[i]连一条费用为c[i]的边,建立一个超级源点连向所有的不重要战场。把所有的重要战场的最短路加起来就是答案。
注意INF需要开到10^10以上。
#include <bits/stdc++.h> using namespace std; #define maxn 3111111 #define INF 11111111111111 int n, m, cnt, head[maxn]; int val[maxn], x[maxn], y[maxn]; long long c[maxn], d[maxn]; struct node { int to, next; long long w; }edge[maxn]; void add_edge (int from, int to, long long w, int i) { node &e = edge[i]; e.to = to, e.next = head[from], e.w = w, head[from] = i; } bool vis[maxn]; bool spfa (int start) { memset (vis, 0, sizeof vis); for (int i = 0; i <= n+m; i++) d[i] = INF; vis[start] = 1; d[start] = 0; queue <int> q; while (!q.empty ()) q.pop (); q.push (start); while (!q.empty ()) { int u = q.front (); q.pop (); vis[u] = 0; for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if (d[v] > d[u]+edge[i].w) { d[v] = d[u]+edge[i].w; if (!vis[v]) { vis[v] = 1; q.push (v); } } } } return 1; } int main () { //freopen ("in", "r", stdin); ios::sync_with_stdio(false); int t, kase = 0; cin >> t; while (t--) { printf ("Case #%d: ", ++kase); cin >> n >> m; cnt = 0; memset (head, -1, sizeof head); for (int i = 1; i <= n; i++) { cin >> x[i]; } for (int i = 1; i <= n; i++) { cin >> y[i]; } for (int i = 1; i <= n; i++) { cin >> c[i]; } for (int i = 1; i <= m; i++) { //scanf ("%d", &val[i]); cin >> val[i]; } for (int i = 1; i <= n; i++) { add_edge (y[i]+n, i, 0, cnt++); add_edge (i, x[i]+n, c[i], cnt++); } for (int i = 1; i <= m; i++) { if (!val[i]) { add_edge (0, i+n, 0, cnt++); } } spfa (0); long long ans = 0; for (int i = 1; i <= m; i++) { if (val[i] == 2) { if (d[i+n] == INF) { printf ("-1\n"); goto out; } else ans += d[i+n]; } } printf ("%lld\n", ans); out: ; } return 0; }
相关文章推荐
- requestLayout() 和 invalidate()的区别
- bzoj3538【Usaco2014 Open】Dueling GPS
- Opencv 鼠标事件GUI
- 黑马程序员——Java基础(十一)之GUI
- Lightoj 1100 - Again Array Queries (枚举剪枝)
- Java中String ,StringBuffer和StringBuilder的区别
- Qt基础——UI文件.h文件说明
- OC 非常用类 --- NSValue
- jd-gui--class文件的反编译工具
- UI作品制作
- HDU - 1711 Number Sequence(KMP)
- Web应用中request获取path,URI,URL
- 关于UI设计师面试的那些事儿
- iOS界面编程-UITextView
- UI设计中主流椭圆矩形2钟标准绘制方法
- 绘制自定义的图形
- require.js的理解
- 创建UITableViewCell(不使用XIB情况)
- hdu 4620 Fruit Ninja Extreme(暴力)
- UESTC OJ1217(树状数组)