【HDOJ】3315 My Brute
几乎与2853相同,Successive Shortest Path Algorithm(SSPA) 解费用流。
1 /* 3315 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <deque> 10 #include <algorithm> 11 #include <cstdio> 12 #include <cmath> 13 #include <ctime> 14 #include <cstring> 15 #include <climits> 16 #include <cctype> 17 #include <cassert> 18 #include <functional> 19 #include <iterator> 20 #include <iomanip> 21 using namespace std; 22 //#pragma comment(linker,"/STACK:102400000,1024000") 23 24 #define sti set<int> 25 #define stpii set<pair<int, int> > 26 #define mpii map<int,int> 27 #define vi vector<int> 28 #define pii pair<int,int> 29 #define vpii vector<pair<int,int> > 30 #define rep(i, a, n) for (int i=a;i<n;++i) 31 #define per(i, a, n) for (int i=n-1;i>=a;--i) 32 #define clr clear 33 #define pb push_back 34 #define mp make_pair 35 #define fir first 36 #define sec second 37 #define all(x) (x).begin(),(x).end() 38 #define SZ(x) ((int)(x).size()) 39 #define lson l, mid, rt<<1 40 #define rson mid+1, r, rt<<1|1 41 42 const int INF = 0x1f1f1f1f; 43 const int maxn = 105; 44 const int maxv = maxn*2; 45 const int maxe = maxv * maxv * 5; 46 int V[maxe], F[maxe], W[maxe], nxt[maxe]; 47 int head[maxv], pre[maxv], ID[maxv], dis[maxv], cnt[maxv]; 48 bool visit[maxv]; 49 int Hi[maxn], Pi[maxn], Ai[maxn], Bi[maxn], Vi[maxn]; 50 int s, t, m; 51 52 bool win(int i, int j) { 53 int c1 = (Pi[j] + Ai[i] - 1) / Ai[i]; 54 int c2 = (Hi[i] + Bi[j] - 1) / Bi[j]; 55 56 return c1 <= c2; 57 } 58 59 void addEdge(int u, int v, int c, int w) { 60 V[m] = v; 61 F[m] = c; 62 W[m] = w; 63 nxt[m] = head[u]; 64 head[u] = m++; 65 66 V[m] = u; 67 F[m] = 0; 68 W[m] = -w; 69 nxt[m] = head[v]; 70 head[v] = m++; 71 } 72 73 void Bellman_Ford(int st, int ed) { 74 int u, v, k; 75 queue<int> Q; 76 77 memset(dis, INF, sizeof(dis)); 78 memset(cnt, 0, sizeof(cnt)); 79 memset(pre, -1, sizeof(pre)); 80 dis[st] = 0; 81 cnt[st] = 1; 82 Q.push(st); 83 84 while (!Q.empty()) { 85 u = Q.front(); 86 Q.pop(); 87 cnt[u] = -cnt[u]; 88 for (k=head[u]; k!=-1; k=nxt[k]) { 89 v = V[k]; 90 if (F[k] && dis[v]>dis[u]+W[k]) { 91 dis[v] = dis[u] + W[k]; 92 ID[v] = k; 93 pre[v] = u; 94 if (cnt[v] <= 0) { 95 cnt[v] = -cnt[v] + 1; 96 Q.push(v); 97 } 98 } 99 } 100 } 101 } 102 103 bool bfs(int st, int ed) { 104 Bellman_Ford(st, ed); 105 priority_queue<pii, vector<pii>, greater<pii> > Q; 106 int u, v, k; 107 108 Q.push(make_pair(0, st)); 109 while (!Q.empty()) { 110 pii p = Q.top(); 111 Q.pop(); 112 u = p.second; 113 if (dis[p.second] > p.first) continue; 114 if (u == ed) break; 115 for (k=head[u]; k!=-1; k=nxt[k]) { 116 v = V[k]; 117 if (F[k] && dis[v]>dis[u]+W[k]) { 118 dis[v] = dis[u] + W[k]; 119 ID[v] = k; 120 pre[v] = u; 121 Q.push(make_pair(dis[v], v)); 122 } 123 } 124 } 125 126 return pre[ed] == -1; 127 } 128 129 int MCMF(int s, int t) { 130 int ret = 0, tmp; 131 int u, v, k; 132 133 while (1) { 134 if (bfs(s, t)) 135 break; 136 137 tmp = INF; 138 for (v=t, u=pre[v]; v!=s; v=u, u=pre[v]) { 139 k = ID[v]; 140 tmp = min(F[k], tmp); 141 } 142 143 for (v=t, u=pre[v]; v!=s; v=u, u=pre[v]) { 144 k = ID[v]; 145 F[k] -= tmp; 146 F[k^1] += tmp; 147 } 148 149 ret += dis[t] * tmp; 150 } 151 152 return ret; 153 } 154 155 int main() { 156 ios::sync_with_stdio(false); 157 #ifndef ONLINE_JUDGE 158 freopen("data.in", "r", stdin); 159 freopen("data.out", "w", stdout); 160 #endif 161 162 int n; 163 int ans, tmp; 164 165 while (scanf("%d", &n)!=EOF && n) { 166 rep(i, 1, n+1) 167 scanf("%d", &Vi[i]); 168 rep(i, 1, n+1) 169 scanf("%d", &Hi[i]); 170 rep(i, 1, n+1) 171 scanf("%d", &Pi[i]); 172 rep(i, 1, n+1) 173 scanf("%d", &Ai[i]); 174 rep(i, 1, n+1) 175 scanf("%d", &Bi[i]); 176 177 s = m = 0; 178 t = n + n + 1; 179 memset(head, -1, sizeof(head)); 180 181 rep(i, 1, n+1) { 182 rep(j, 1, n+1) { 183 if (win(i, j)) { 184 if (i == j) { 185 tmp = Vi[i] * 100 + 1; 186 } else { 187 tmp = Vi[i] * 100; 188 } 189 } else { 190 if (i == j) { 191 tmp = -Vi[i] * 100 + 1; 192 } else { 193 tmp = -Vi[i] * 100; 194 } 195 } 196 addEdge(i, n+j, 1, -tmp); 197 } 198 } 199 200 rep(i, 1, n+1) { 201 addEdge(s, i, 1, 0); 202 addEdge(n+i, t, 1, 0); 203 } 204 205 ans = -MCMF(s, t); 206 if (ans < 100) { 207 puts("Oh, I lose my dear seaco!"); 208 } else { 209 printf("%d %.03f%%\n", ans/100, ans%100*100.0/n); 210 } 211 } 212 213 #ifndef ONLINE_JUDGE 214 printf("time = %d.\n", (int)clock()); 215 #endif 216 217 return 0; 218 }