【洛谷P2936】全流

本人今天刚刚学会最大流,此题感觉完全没有提高+的难度,仅仅是一个模板最大流,我用了Dinic算法,而且本题数据很小,邻接矩阵存图即可。

注意:本题大小写字母均包括在内!!

被卡了一次10分

Dinic模板的代码 (AC本题)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 using namespace std;
 6 const int INF=99999999;
 7 queue<int>q;
 8 int n,w[257][257],d[257];
 9 inline bool bfs()
10 {
11     memset(d,0,sizeof(d));
12     d['A']=1;
13     q.push('A');
14     while(!q.empty())
15     {
16         int now=q.front();
17         q.pop();
18         for(int i='A';i<='z';i++)   //一定要到小写z
19             if(w[now][i]>0&&d[i]==0)
20             {
21                 d[i]=d[now]+1;
22                 q.push(i);
23             }
24     }
25     return d['Z']!=0;
26 }
27 int dfs(int now,int dist)
28 {
29     if(now=='Z') return dist;
30     for(int i='A';i<='z';i++)  //同上
31         if(d[i]==d[now]+1&&w[now][i]>0)
32         {
33             int x=dfs(i,min(dist,w[now][i]));
34             if(x>0)
35             {
36                 w[now][i]-=x;
37                 w[i][now]+=x;
38                 return x;
39             }
40         }
41     return 0;
42 }
43 int main()
44 {
45     cin>>n;
46     for(int i=1;i<=n;i++)
47     {
48         char x,y;
49         int z;
50         cin>>x>>y>>z;
51         w[x][y]+=z;
52     }
53     int ans=0;
54     while(bfs())
55     {
56         while(int di=dfs('A',INF))
57             ans+=di;
58     }
59     cout<<ans;
60     return 0;
61 }

猜你喜欢

转载自www.cnblogs.com/shl-blog/p/10500790.html
今日推荐