Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
discuss里数据都过了,但是交还是WA我是这样网络流的 S,T为99998 和99999 一开始有N种插头,全部连S。 出现一次流量就是1,出现2次流量就是2. 后来的M个用电器,都连T。 出现1次流量是1,2次就是2。。 插头,插座的编号是一起的。 如果有A插头,也有A用电器,那么就是S ->A -> T 下面的K个配置器 x,y配置起, 那么 y -> x 流量为无穷大 各种帖子的数据全过了,我数组开那么大也不是数组问题把。求破 ps : g++ c++就编译失败了,为什么呢 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <map> using namespace std; #define CLR(a,b) memset(a, b, sizeof(a)) const int max_char = 5000; const int max_n = 100000; const int inf = 0x7fffffff; int n,m,k; char ts[max_char]; map<string, int>h, g, num; map<string, int>:: iterator it; map<string, int>:: iterator it2; string s; int tot = 0; int S = 99998, T = 99999; int now[max_n], next[max_n], pre[max_n], flow[max_n], dot[max_n], tail = 0; void init(); void getmun(const string &); void doit(); void insert(int, int, int); int main() { while (scanf("%d", &n) != EOF) { init(); doit(); } return 0; } void getnum(const string &x) { it = num.find(x); if (it != num.end()) return; num[x] = ++ tot; } void insert(int a,int b,int c) { ++ tail; dot[tail] = b; flow[tail] = c; next[tail] = now[a]; now[a] = tail; pre[tail] = ++ tail; dot[tail] = a; flow[tail] = 0; next[tail] = now[b]; now[b] = tail; pre[tail] = tail - 1; } void init() { CLR(flow, 0); CLR(next, 0); CLR(now, 0); CLR(dot, 0); h.clear(); g.clear(); num.clear(); tot = 0; for (int i = 1; i <= n; ++ i) { scanf("%s", ts); s = ts; it = h.find(s) ; if (it != h.end()) ++ h[s]; else h[s] = 1; getnum(s); } scanf("%d\n", &m); for (int i = 1; i <= m; ++ i) { scanf("%s ", ts); scanf("%s", ts); s = ts; it = g.find(s); if (it != g.end()) ++ g[s]; else g[s] = 1; getnum(s); } for (it = num.begin(); it != num.end(); ++ it) { int tmp = (*it).second; s = (*it).first; it2 = h.find(s); if (it2 != h.end()) insert(S, tmp, (*it2).second); it2 = g.find(s); if (it2 != g.end()) insert(tmp, T, (*it2).second); } scanf("%d\n", &k); for (int i = 1; i <= k; ++ i) { int x,y; scanf("%s", ts); s = ts; getnum(s); it = num.find(s); x = (*it).second; scanf("%s", ts); s = ts; getnum(s); it = num.find(s); y = (*it).second; insert(y, x, inf); } tot = num.size() + 2; } int H[max_n] = {0}; int d[max_n] = {0}; int sap(int u,int FF) { int ans = 0; if (u == T) return FF; for (int i = now[u]; i; i = next[i]) { int will = dot[i]; if (flow[i] && d[u] == d[will] + 1) { int tmp = sap(will, min(FF - ans, flow[i])); flow[i] -= tmp; flow[pre[i]] += tmp; ans += tmp; if (ans == FF) return FF; } } if (d[S] >= tot) return ans; if (! --H[d[u]]) d[S] = tot; ++ H[++d[u]]; return ans; } void doit() { CLR(H, 0); CLR(d, 0); int ans = 0; for(H[0] = tot; d[S] < tot ;) ans += sap(S, inf); printf("%d\n", m - ans); } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator