hdu3549(网络流)买一送一poj1273

这道题跟poj1273是一模一样的,只略微改变了几个地方,就ok了,更正下,上面的算法不叫Ford_Fulkerson ,而是EK

 1 #include <cstdio>
 2 #include <cstring>
 3 #define Max 0x7f7f7f7f
 4 int n,m;
 5 int path[100][100];
 6 int visited[100];
 7 int que[10000];
 8 int pre[100];
 9 int flow[100];
10 int min(int a ,int b)
11 {
12     return a>b?b:a;
13 }
14 int BFS()//查找有没有增广路
15 {
16     memset(visited,0,sizeof(visited));
17     memset(pre,-1,sizeof(pre));
18     memset(flow,Max,sizeof(flow));
19     int head=0;
20     int tail=1;
21     que[head]=1;
22     visited[1]=1;
23     while(head<tail)
24     {
25         int tmp=que[head];
26         if(tmp==n) break;
27         for(int i=2;i<=n;i++)
28         {
29             if(visited[i]==0 && path[tmp][i]!=0)
30             {
31                 visited[i]=1;
32                 pre[i]=tmp;
33                 que[tail]=i;
34                 flow[i]=min(flow[tmp],path[tmp][i]);
35                 tail++;
36 
37             }
38         }
39         head++;
40     }
41     if(visited[n]==0)
42     return -1;
43     else return flow[n];//有增广路
44 }
45 
46 int Ford_Fulkerson()
47 {
48     int nowflow,maxflow=0;
49     while((nowflow=BFS())!=-1)//更新残余网络
50     {
51         maxflow+=nowflow;
52         int tmp=n;
53         while(tmp!=1)
54         {
55             int before=pre[tmp];
56             path[before][tmp]-=nowflow;
57             path[tmp][before]+=nowflow;
58             tmp=before;
59         }
60     }
61     return maxflow;
62 }
63 
64 int main()
65 {
66     int start,end,value;
67     int Case;
68     int k=1;
69     scanf("%d",&Case);
70     while(Case--)
71     {
72         scanf("%d%d",&n,&m);
73         memset(path,0,sizeof(path));
74         for(int i=1;i<=m;i++)
75         {
76             scanf("%d%d%d",&start,&end,&value);
77             path[start][end]+=value;
78         }
79         printf("Case %d: %d\n",k++,Ford_Fulkerson());
80     }
81 
82     return 0;
83 }

posted on 2012-08-17 15:34  矮人狙击手!  阅读(185)  评论(0编辑  收藏  举报

导航