zcl_ccc 发表于 2015-9-20 10:36:03

hdu 4280 最大流sap

  模板套起来

1  
5 7  //5个结点,7个边
3 3  //坐标
3 0  
3 1
0 0
4 5
1 3 3  //相连的结点和流
2 3 4
2 4 3
1 5 6
4 5 3
1 4 4
3 4 2
9


1 #include<cstdio>
2 #include<algorithm>
3 #include<cstring>
4 using namespace std;
5 const int MAXN = 100010;//点数的最大值
6 const int MAXM = 400010;//边数的最大值
7 const int INF = 0x3f3f3f3f;
8 int n;
9 struct Edge
10 {
11   int to,next,cap,flow;
12 }edge;//注意是MAXM
13 int tol;
14 int head;
15 int gap,dep,cur;
16 void init()
17 {
18   tol = 0;
19   memset(head,-1,sizeof(head));
20 }
21 void addedge(int u,int v,int w,int rw = 0)
22 {
23   edge.to = v; edge.cap = w; edge.flow = 0;
24   edge.next = head; head = tol++;
25   edge.to = u; edge.cap = rw; edge.flow = 0;
26   edge.next = head; head = tol++;
27 }
28 int Q;
29 void BFS(int start,int end)
30 {
31   memset(dep,-1,sizeof(dep));
32   memset(gap,0,sizeof(gap));
33   gap = 1;
34   int front = 0, rear = 0;
35   dep = 0;
36   Q = end;
37   while(front != rear)
38   {
39         int u = Q;
40         for(int i = head; i != -1; i = edge.next)
41         {
42             int v = edge.to;
43             if(dep != -1)continue;
44             Q = v;
45             dep = dep + 1;
46             gap]++;
47         }
48   }
49 }
50 int S;
51 int SAP(int start,int end,int N)
52 {
53   BFS(start,end);
54   memcpy(cur,head,sizeof(head));
55   int top = 0;
56   int u = start;
57   int ans = 0;
58   while(dep < N)
59   {
60         if(u == end)
61         {
62             int Min = INF;
63             int inser;
64             for(int i = 0;i < top;i++)
65             if(Min > edge].cap - edge].flow)
66             {
67               Min = edge].cap - edge].flow;
68               inser = i;
69             }
70             for(int i = 0;i < top;i++)
71             {
72               edge].flow += Min;
73               edge^1].flow -= Min;
74             }
75             ans += Min;
76             top = inser;
77             u = edge^1].to;
78             continue;
79         }
80         bool flag = false;
81         int v;
82         for(int i = cur; i != -1; i = edge.next)
83         {
84             v = edge.to;
85             if(edge.cap - edge.flow && dep+1 == dep)
86             {
87               flag = true;
88               cur = i;
89               break;
90             }
91         }
92         if(flag)
93         {
94             S = cur;
95             u = v;
96             continue;
97         }
98         int Min = N;
99         for(int i = head; i != -1; i = edge.next)
100         if(edge.cap - edge.flow && dep.to] < Min)
101         {
102             Min = dep.to];
103             cur = i;
104         }
105         gap]--;
106         if(!gap])return ans;
107         dep = Min + 1;
108         gap]++;
109         if(u != start)u = edge^1].to;
110         }
111   return ans;
112 }
113 int main()
114 {
115   #ifndef ONLINE_JUDGE
116   freopen("1.in","r",stdin);
117   #endif
118   int start,end;
119   int m;
120   int u,v,z;
121   int T;
122   scanf("%d",&T);
123   while(T--)
124   {
125         init();
126         scanf("%d%d",&n,&m);
127         int minx=10000000;
128         int maxx=-10000000;
129         int x,y;
130         for(int i=1;i<=n;i++)
131         {
132             scanf("%d%d",&x,&y);
133             if(minx>x)
134             {
135               minx=x;
136               start=i;
137             }
138             if(maxx<x)
139             {
140               maxx=x;
141               end=i;
142             }
143         }
144         while(m--)
145         {
146             scanf("%d%d%d",&u,&v,&z);
147             addedge(u,v,z);
148             addedge(v,u,z);
149         }
150         int ans=SAP(start,end,n);
151         printf("%d\n",ans);
152   }
153   return 0;
154 }
  
页: [1]
查看完整版本: hdu 4280 最大流sap