有关网络流的只是个人认为这里是讲解的最详细的:http://baike.baidu.com/view/165435.htm 今天主要学习了最简单的算法,ford-Fulkerson(BFS)。 下面结合3549给出该算法模版: #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; #define init(a,what) memset(a,what,sizeof(a)) #define read freopen("zx.in","r",stdin) #define write freopen("zx.out","w",stdout) #define INF 0x3f3f3f3f const int MAXN=1003; int cost[MAXN][MAXN],fa[MAXN],nnum,mnum,ans; bool vis[MAXN]; void MAXflow() { queue<int>q; while(1)//这里应当理解为路径有多条,每次宽搜只能找到一条(按路径长度依次曾大)! { while(!q.empty()) q.pop();//清空队列 init(vis,false); init(fa,0); q.push(1);//起点入队列 vis[1]=true; while(!q.empty()) { int cur=q.front(); q.pop(); if(cur==nnum) break;//这条路已到了终点 for(int i=1;i<=nnum;i++) { if(!vis[i] && cost[cur][i])//有连通并且该点没有被访问 { fa[i]=cur, vis[i]=true, q.push(i);//记录father结点同时将i入队列 } } } if(!vis[nnum]) break;//有没有到达?! int minn=INF;//找出该条道路的最小残量 for(int e=nnum;e!=1;e=fa[e]) { if(minn>cost[fa[e]][e]) minn=cost[fa[e]][e]; } for(int e=nnum;e!=1;e=fa[e])//更新正反向流量(外加输出路径) { printf(e==nnum ? "%d":"-->%d",e); cost[fa[e]][e]-=minn; cost[e][fa[e]]+=minn; } printf("-->1/n"); ans+=minn;//最大运货量 } } int main() { read, write; int ncase,u,v,cminte; scanf("%d",&ncase); int text=0; while(ncase--) { text++; scanf("%d%d",&nnum,&mnum); init(cost,0); for(int i=0;i<mnum;i++) { scanf("%d%d%d",&u,&v,&cminte); cost[u][v]+=cminte; } ans=0; MAXflow(); printf("Case %d: %d/n",text,ans); printf("/n"); } return 0; }