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 |
Dinic算法一次A#include<iostream> #include<cstring> #include<string> #include<queue> #include<map> using namespace std; const int MAX = 100000; const int INF = 0xfffffff; struct Edge{ int v, f, nxt; }; int n, m, k; int src, sink; int nume = 1; int num = 1; map<string,int> rec_dev; int g[MAX]; Edge e[MAX]; int dist[MAX], vis[MAX]; string plux, device; void addEdge(int u, int v, int c) { e[++nume].v = v; e[nume].f = c; e[nume].nxt = g[u]; g[u] = nume; } void BFS() { memset(vis, 0, sizeof(vis)); queue<int> que; que.push(src); dist[src] = 0; vis[src] = 1; while(!que.empty()) { int u = que.front(); que.pop(); for(int i = g[u]; i; i = e[i].nxt) if(e[i].f && !vis[e[i].v]) { que.push(e[i].v); dist[e[i].v] = dist[u] + 1; vis[e[i].v] = 1; } } } int DFS(int u, int delta) { if(u == sink) return delta; int ret = 0; for(int i = g[u]; delta && i; i = e[i].nxt) if(dist[e[i].v] == dist[u]+1) { //e[i].f && int dd = DFS(e[i].v, e[i].f<delta?e[i].f:delta); e[i].f -= dd; e[i^1].f += dd; delta -= dd; ret += dd; } return ret; } int Dinic() { int ret = 0; while(true) { memset(dist, 0, sizeof(dist)); BFS(); while(!vis[sink]) return ret; ret += DFS(src, INF); } } int main() { memset(g, 0, sizeof(g)); src = 1; sink = MAX-1; cin>>n; for(int i = 1; i <= n; i++) { cin>>plux; rec_dev[plux] = ++num; addEdge(num, sink, 1); addEdge(sink, num, 0); } cin>>m; for(int i = 1; i <= m; i++) { cin>>device>>plux; rec_dev[device] = ++num; if(!rec_dev[plux]) rec_dev[plux] = ++num; addEdge(src, rec_dev[device], 1); addEdge(rec_dev[device], src, 0); addEdge(rec_dev[device], rec_dev[plux], 1); addEdge(rec_dev[plux], rec_dev[device], 0); } cin>>k; for(int i = 1; i <= k; i++) { cin>>device>>plux; if(!rec_dev[device]) rec_dev[device] = ++num; if(!rec_dev[plux]) rec_dev[plux] = ++num; addEdge(rec_dev[device], rec_dev[plux], INF); addEdge(rec_dev[plux], rec_dev[device], 0); } cout<<m-Dinic()<<endl; return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator