poj1273

Drainage Ditches

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 37500 Accepted: 13862

Description

Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage ditches so that Bessie's clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch.
Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network.
Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle.

Input

The input includes several cases. For each case, the first line contains two space-separated integers, N (0 <= N <= 200) and M (2 <= M <= 200). N is the number of ditches that Farmer John has dug. M is the number of intersections points for those ditches. Intersection 1 is the pond. Intersection point M is the stream. Each of the following N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch.

Output

For each case, output a single integer, the maximum rate at which water may emptied from the pond.

Sample Input

5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10

Sample Output

50
话说这是道网络流的模版题,鄙人没写过多少网络流,于是忍不住来练练手
邪恶的是,我打了模版之后,才发现我模版好多错误(自己改的模版),悲剧
然后终于改好了,然后一直wa,
不解,重边我也处理了呀,怎么搞的,
然后去看discuss,忽然发现一组数据
input:
3 2
1 2 3
1 2 4
1 2 5
output:
12
顿时无语了,原来重边在这里要相加啊,我开始取得min,后来取得max
呃,表示自己真心是水货
  1#include<stdio.h>
  2#include<string.h>
  3#include<math.h>
  4#define MAX 205
  5#define inf 0x7fffffff
  6int n,m,s,t;
  7int map[MAX][MAX];
  8int d[MAX],r[MAX][MAX],num[MAX],pre[MAX];
  9int min(int a,int b)
 10{
 11    if(a<b) return a;
 12    else return b;
 13}

 14int void bfs()
 15{
 16    int i,k;
 17    int q[MAX*MAX],head,tail;
 18    for(i=1;i<=n;i++)
 19        d[i]=n+1;
 20    memset(num,0,sizeof(num));
 21    head=0;
 22    tail=1;
 23    q[tail]=t;
 24    d[t]=0;
 25    num[0]=1;
 26    while(head<tail)
 27    {
 28        head++;
 29        k=q[head];
 30        for(i=1; i<=n; i++)
 31        {
 32            if(d[i]>n&&r[i][k]>0)
 33            {
 34                d[i]=d[k]+1;
 35                tail++;
 36                q[tail]=i;
 37                num[d[i]]++;
 38            }

 39        }

 40    }

 41}

 42int findalowarc(int i)
 43{
 44    int j;
 45    for(j=1; j<=n; j++)
 46        if((r[i][j]>0)&&(d[i]==d[j]+1)) return j;
 47    return -1;
 48}

 49int relabel(int i)
 50{
 51    int j;
 52    int mm=inf;
 53    for(j=1; j<=n; j++)
 54    {
 55        if (r[i][j]>0) mm=min(mm,d[j]+1);
 56    }

 57    return (mm==inf)?n:mm;
 58}

 59int maxflow()
 60{
 61    int flow,i,j,delta;
 62    int x;
 63    bfs();
 64    i=s;
 65    flow=0;
 66    memset(pre,-1,sizeof(pre));
 67    while(d[s]<=n)
 68    {
 69        j=findalowarc(i);
 70        if(j>0)
 71        {
 72            pre[j]=i;
 73            i=j;
 74            if(i==t)
 75            {
 76                delta=inf;
 77                for(i=t; i!=s; i=pre[i])
 78                    delta=min(delta,r[pre[i]][i]);
 79                for(i=t; i!=s; i=pre[i])
 80                {
 81                    r[pre[i]][i]-=delta;
 82                    r[i][pre[i]]+=delta;
 83                }

 84                flow+=delta;
 85            }

 86        }

 87        else
 88        {
 89            x=relabel(i);
 90            num[x]++;
 91            num[d[i]]--;
 92            if(num[d[i]]==0return flow;//间隙优化
 93            d[i]=x;
 94            if(i!=s) i=pre[i];
 95        }

 96    }

 97    return flow;
 98}

 99int main()
100{
101    int i,j;
102    int x,y,z;
103    while (scanf("%d%d",&m,&n)!=EOF)
104    {
105        s=1;
106        t=n;
107        memset(map,0,sizeof(map));
108        for (i=1; i<=m; i++ )
109        {
110            scanf("%d%d%d",&x,&y,&z);
111            if (map[x][y]==0)
112            {
113                map[x][y]=z;
114            }

115            else
116            {
117                map[x][y]=map[x][y]+z;
118            }

119        }

120        for(i=1; i<=n; i++)
121            for(j=1; j<=n; j++)
122                r[i][j]=map[i][j];
123        printf("%d\n",maxflow());
124    }

125    return 0;
126}

127
 还发现个问题
我写的sap怎么跑了16ms,同学写的ek才跑了0ms
why??

posted on 2012-03-14 00:20 jh818012 阅读(336) 评论(1)  编辑 收藏 引用

评论

# re: poj1273 2012-03-20 10:02 王私江

哈哈哈,您弱爆了!!  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年7月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿

文章档案(85)

搜索

最新评论