运输问题1

11. 运输问题1

【问题描述】
    一个工厂每天生产若干商品,需运输到销售部门进行销售。从产地到销地要经过某些城镇,有不同的路线可以行走,每条两城镇间的公路都有一定的流量限制。请你计算,在不考虑其它车辆使用公路的前提下,如何充分利用所有的公路,使产地运输到销地的商品最多,最多能运输多少商品。
【输入格式】
输入文件有若干行
第一行,一个整数n,表示共有n个城市(2<=n<=100),产地是1号城市,销地是n号城市。
下面有n行,每行有n个数字。第p行第q列的数字表示城镇p与城镇q之间有无公路连接。数字为0表示无,大于0表示有公路,且该数字表示该公路流量。
【输出格式】
输出文件有一行
第一行,1个整数max,表示最大流量为max。
【输入输出样例】
6
0 4 8 0 0 0
0 0 4 4 1 0
0 0 0 2 2 0
0 0 0 0 0 7
0 0 0 6 0 9
0 0 0 0 0 0
8
一道裸的网络流:
 
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 #define inf 1000000
 8 int n,m,num,x,ans;
 9 int adj[1002];
10 struct flow{
11     int s,t,w,next;
12 }k[10001];
13 int read(){
14     int sum=0;char ch=getchar();
15     while(ch<'0'||ch>'9') ch=getchar();
16     while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
17     return sum;
18 }
19 void init(int s,int t,int w){
20     k[num].s=s;k[num].t=t;k[num].w=w;
21     k[num].next=adj[s];adj[s]=num++;
22 }
23 int dp[1001];
24 bool bfs(){
25     memset(dp,0,sizeof(dp));
26     queue<int>q;
27     q.push(1);dp[1]=1;
28     while(!q.empty()){
29         int o=q.front();q.pop();
30         for(int i=adj[o];i!=-1;i=k[i].next){
31             if(!k[i].w||dp[k[i].t]) continue;
32             dp[k[i].t]=dp[o]+1;
33             if(k[i].t==n) return true;
34             q.push(k[i].t);
35         }
36     }
37     return false;
38     
39 }
40 int dfs(int o,int fw){
41     if(o==n) return fw;
42     int tmp=fw,u;
43     for(int i=adj[o];i!=-1;i=k[i].next){
44         if(!k[i].w||!tmp||dp[k[i].t]!=dp[o]+1) continue;
45         u=dfs(k[i].t,min(k[i].w,tmp));
46         if(!u){
47             dp[k[i].t]=0;continue;
48         }
49         k[i].w-=u;k[i^1].w+=u;tmp-=u;
50     }
51     return fw-tmp;
52 }
53 int main(){
54     memset(adj,-1,sizeof(adj));
55     n=read();
56     for(int i=1;i<=n;++i)
57         for(int j=1;j<=n;++j){
58             x=read();
59             if(x)  init(i,j,x),init(j,i,0);
60         }
61     while(bfs())
62         ans+=dfs(1,inf);
63     printf("%d\n",ans);
64     // while(1);
65     return 0;
66 }

网络流第一题:撒花~!

posted @ 2017-07-29 16:55  Hzoi_Maple  阅读(170)  评论(0编辑  收藏  举报