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#include <cstdio> #include <queue> #include <iostream> #include <vector> #include <cstring> using namespace std; struct E { int u, v, f; E() {}; E(int a, int b, int c) { u = a; v = b; f = c; } }edge[500]; const int inf = 0x3f3f3f3f; int n, m; int s[500][500];//边集 int t;//总边数(含反向边) int cur[500]; //当前弧 int dis[500]; //分层 void add(int u, int v, int f) { s[u][0]++; s[u][s[u][0]] = t; edge[t++] = E(u, v, f); s[v][0]++; s[v][s[v][0]] = t; edge[t++] = E(v, u, 0); } bool bfs() { queue<int> q; for (int i = 1; i <= m; i++) { dis[i] = 0; } dis[1] = 1; q.push(1); while (!q.empty()) { int now = q.front(); q.pop(); for (int i = 1; i <= s[now][0]; i++) { E &temp = edge[s[now][i]]; //cout << i << ends << now << ends << temp.v << endl; if (temp.f && !dis[temp.v]) { //cout << "1" << endl; dis[temp.v] = dis[now] + 1; q.push(temp.v); } } } return dis[m]; } int dfs(int index, int flow)//起点 , 流量 { if (index == m) return flow; if (!cur[index]) cur[index] = 1; for (int i = cur[index]; i <= s[index][0]; i++) { E &e = edge[s[index][i]]; E &e1 = edge[s[index][i] ^ 1]; if (e.f > 0 && dis[e.v] == dis[index] + 1) { int x = dfs(e.v, min(flow, e.f)); if (x > 0) { e.f -= x; e1.f += x; cur[index] = i; return x; } } } return 0; } int dinic() { int sum = 0, num; while (bfs()) { memset(cur, 0, sizeof(cur)); do { num = dfs(1,inf); sum += num; } while (!num); } return sum; } int main() { while (~scanf("%d %d", &n, &m)) { for (int i = 0; i <= m; i++) s[i][0] = 0; t = 0; for (int i = 0; i < n; i++) { int u, v, f; scanf("%d %d %d", &u, &v, &f); add(u, v, f); } printf("%d\n", dinic()); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator