| ||||||||||
| 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 | |||||||||
C++提交AC,G++提交WA,求解,附代码,请指教#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
//#define DEBUG
typedef long long captype;
typedef struct Vertex_ {
int id;
captype capacity;
struct Vertex_* next;
struct Vertex_* ref;
} Vertex;
#define N 500
Vertex poolVertices[N+10];
int indexPool = 0;
void initPool() {
indexPool = 0;
}
Vertex* getVertex(int id, captype capacity, Vertex* next, Vertex* ref) {
poolVertices[indexPool].next = next;
poolVertices[indexPool].ref = ref;
poolVertices[indexPool].capacity = capacity;
poolVertices[indexPool].id = id;
return poolVertices + indexPool++;
}
Vertex residualGraph[N+10];
void initGraph(Vertex* g, int n) {
for (int i = 1; i <= n; ++i) {
g[i].next = NULL;
}
}
void addEdge(Vertex* g, int u, int v, captype c) {
bool edgeBuilt = false;
for (Vertex *p = g[u].next; p != NULL; p = p->next) {
if (p->id == v) {
p->capacity += c;
edgeBuilt = true;
break;
}
}
if (!edgeBuilt) {
Vertex* p = getVertex(v, c, g[u].next, NULL);
Vertex* p2 = getVertex(u, 0, g[v].next, p);
p->ref = p2;
g[u].next = p;
g[v].next = p2;
}
}
#define INF 1e18
bool visited[N + 10];
captype augment0(Vertex* g, int s, int t, captype curBottleNeck) {
visited[s] = true;
bool found = false;
Vertex* v = NULL;
captype bottleNeck = 0;
for (Vertex* tra = g[s].next; tra != NULL && !found; tra = tra->next) {
if (tra->capacity <= 0 || visited[tra->id]) {
continue;
}
if (tra->id == t) {
bottleNeck = min(tra->capacity, curBottleNeck);
found = true;
v = tra;
} else {
bottleNeck = min(curBottleNeck, tra->capacity);
bottleNeck = augment0(g, tra->id, t, bottleNeck);
if (bottleNeck > 0) {
found = true;
v = tra;
}
}
}
if (found) {
v->capacity -= bottleNeck;
v->ref->capacity += bottleNeck;
#ifdef DEBUG
printf("%d ", v->id);
#endif
}
return bottleNeck;
}
captype augment(Vertex* g, int s, int t, int n) {
captype totflow = 0;
captype augmentedFlow;
while (augmentedFlow != 0) {
memset(visited, false, sizeof(visited));
augmentedFlow = augment0(g, s, t, INF);
totflow += augmentedFlow;
#ifdef DEBUG
printf("augment: %I64d\n", augmentedFlow);
#endif
}
return totflow;
}
int main(int argc, char *argv[]) {
int ne, nv, u, v;
captype c;
while (scanf("%d%d", &ne, &nv) != EOF) {
initPool();
initGraph(residualGraph, nv);
for (int i = 0; i < ne; ++i) {
//scanf("%d%d%I64d", &u, &v, &c);
cin >> u >> v >> c;
addEdge(residualGraph, u, v, c);
}
captype res = augment(residualGraph, 1, nv, nv);
//printf("%I64d\n", res);
cout << res << 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