标签:
http://acm.hdu.edu.cn/showproblem.php?pid=3549
同样的网络最大流
T了好几次原因是用了cout,改成printf就A了
还有HDU oj的编译器也不支持以下的写法
G[from].push_back((edge){to,cap,G[to].size()});
G[to].push_back((edge){from,0,G[from].size() - 1});
#include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<cstring> #include<queue> #define oo 0x3f3f3f3f #define MAXN 1005 using namespace std; struct edge { int to;//终点 int cap;//容量 int rev;//反向边 }; vector <edge> G[MAXN]; int level[MAXN];//顶点到源点的距离编号 int iter[MAXN];//当前弧,在其之前的边不用再考虑 void add_edge(int from,int to,int cap)//增加s->t容量cap的边 { struct edge edge1={to,cap,G[to].size()} ; G[from].push_back(edge1); struct edge edge2={from,0,G[from].size()-1}; G[to].push_back(edge2); } //bfs用来计算从源点出发所有点的距离编号 void bfs(int s) { memset(level, -1, sizeof(level)); queue<int> que; level[s] = 0; que.push(s); while (!que.empty()) { int v = que.front(); que.pop(); for (int i = 0; i < G[v].size(); i++) { edge &e = G[v][i]; if (e.cap > 0 && level[e.to] < 0) { level[e.to] = level[v] + 1; que.push(e.to); } } } } //通过DFS寻找当前的最短的增广路 int dfs(int v, int t, int f) { if (v == t) return f; for (int &i = iter[v]; i < G[v].size(); i++) {//这里用引用,巧妙地修改了iter数组 edge &e = G[v][i]; if (e.cap > 0 && level[v] < level[e.to]) {//level[v] < level[e.to]这个条件保证了当前的增广路是最短的 int d = dfs(e.to, t, min(f, e.cap)); if (d > 0) { e.cap -= d; G[e.to][e.rev].cap += d; return d; } } } return 0; } int max_flow(int s, int t) { int flow = 0; for(;;) { bfs(s); if (level[t] < 0) return flow; memset(iter, 0, sizeof(iter)); int f; while ((f = dfs(s, t, oo)) > 0) { flow += f; } } } void init() { for(int i = 0; i < MAXN; i++) { G[i].clear(); } } int main() { int n,m,s,e,c,i,t,yy; scanf("%d",&t); yy=t; while(t--) { init(); scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%d",&s,&e,&c); add_edge(s,e,c); } printf("Case %d: %d\n",yy-t,max_flow(1,n)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/dzzy/p/5223454.html