<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      最大流模板(EK,Dinic

      一、EK

      EK算法:用bfs找增廣路直到找不到為止。找到則更新最大流和殘余網(wǎng)絡(luò),找不到則結(jié)束。

      殘余網(wǎng)絡(luò):對(duì)于一條走過的邊,其正向邊權(quán)值減少相應(yīng)值,反向邊權(quán)值增加相應(yīng)值(用于反悔)。

      增廣路:從所求起點(diǎn)到終點(diǎn)之間還可以增大流量的路徑。

      復(fù)雜度O(n*m^2)

      #include<bits/stdc++.h>
      using namespace std;
      #define ll long long
      int n,m,s,t;
      const int maxn=220;
      ll G[maxn][maxn],flow[maxn],pre[maxn];//flow:源點(diǎn)到當(dāng)前點(diǎn)的流量,pre增廣路的上一條邊
      ll bfs(int s,int t){//找增廣路
          queue<int>qu;
          while(!qu.empty())qu.pop();
          memset(pre,-1,sizeof pre);//記錄前驅(qū)
          pre[s]=0;
          flow[s]=0x3f3f3f3f;
          qu.push(s);
          while(!qu.empty()){
              int p=qu.front();qu.pop();
              if(p==t)break;
              for(int i=1;i<=n;i++){
                  if(i!=s&&G[p][i]>0&&pre[i]==-1){
                      pre[i]=p;
                      flow[i]=min(flow[p],G[p][i]);//選承載量最小的
                      qu.push(i);
                  }
              }
          }
          if(pre[t]==-1)return -1;
          return flow[t];
      }
      ll EK(int s,int t){
          ll ans=0,tot=0;
          while(1){
              ans=bfs(s,t);
              if(ans==-1)break;
              int p=t;
              while(p!=s){//回溯整條增廣路,進(jìn)行更新
                  G[pre[p]][p]-=ans;
                  G[p][pre[p]]+=ans;//反向邊
                  p=pre[p];
              }
              tot+=ans;
          }
          return tot;
      }
      int main()
      {
          int i,j;
          cin>>n>>m>>s>>t;
          memset(G,0,sizeof G);
          memset(flow,0,sizeof flow);
          for(i=0;i<m;i++){
              int a,b;ll c;cin>>a>>b>>c;
              G[a][b]+=c;//累計(jì)容量 防止重邊
          }
          cout<<EK(s,t);
          return 0;
      }
      View Code

       二、Dinic

      有時(shí)候EK會(huì)超時(shí) 因?yàn)榭赡軙?huì)出現(xiàn)增廣路經(jīng)過的其中一條邊值為1,而其他邊值很大的情況,則需要一直增廣。

      而Dinic利用分層可以一次dfs實(shí)現(xiàn)多次增廣,從而優(yōu)化EK算法。

      Dinic算法:先利用bfs進(jìn)行分層(只能往層數(shù)+1的地方走),再利用dfs實(shí)現(xiàn)進(jìn)行增廣(一次dfs實(shí)現(xiàn)多次增廣)。該步驟一直循環(huán)直到不可分層為止。

      復(fù)雜度O(m*n^2)

      #include <bits/stdc++.h>
      using namespace std;
      const int maxn = 50005;
      const int maxm=500010;//
      const int inf =0x3f3f3f3f;
      int head[maxn],dis[maxn];
      struct Edge
      {
          int to,next,f;
      }edge[maxm]; //鏈?zhǔn)角跋蛐?/span>
      int s,t,cnt;
      void add(int u,int v,int f)
      {
          edge[cnt].to=v;
          edge[cnt].f=f;
          edge[cnt].next=head[u];
          head[u]=cnt++; //正向建邊//相鄰邊則為反向邊,cnt從0開始(1不行)
          edge[cnt].to=u;
          edge[cnt].f=0;
          edge[cnt].next=head[v];
          head[v]=cnt++;  //反向建邊
      }
      bool bfs()
      {
          memset(dis,-1,sizeof(dis));
          queue <int> que;
          dis[s]=0;
          que.push(s);
          while(!que.empty())
          {
              int u=que.front();
              que.pop();
              for(int i=head[u];i!=-1;i=edge[i].next)
              {
                  int v=edge[i].to;
                  int f=edge[i].f;
                  if(dis[v]==-1&&f>0)//有流量且未訪問過
                  {
                      dis[v]=dis[u]+1;//分層
                      if(v==t) return true;
                      que.push(v);
                  }
              }
          }
          return false;
      }
      int dfs(int x,int maxf) //maxf表多少流量流到當(dāng)前節(jié)點(diǎn)
      {
          if(x==t||maxf==0) return maxf;
          int flow=0;
          for(int i=head[x];i!=-1;i=edge[i].next)
          {
              int v=edge[i].to;
              int f=edge[i].f;
              if(dis[v]==dis[x]+1&&f>0)
              {
                  f=dfs(v,min(f,maxf-flow));//當(dāng)前邊的容量和該點(diǎn)剩余量取min
                  edge[i].f-=f;
                  edge[i^1].f+=f;//相鄰邊則為反向邊,通過異或可以直接找到反向邊
                  flow+=f;
                  if(flow==maxf) return flow;
              }
          }
          return flow;
      }
      int main()
      {
          int T,n,m,k;
          cin>>n>>m>>s>>t;
              cnt=0;
              memset(head,-1,sizeof(head));
              for(int i=0;i<m;i++)
              {
                  int u,v,f;
                  scanf("%d%d%d",&u,&v,&f);
                  add(u,v,f);  //加邊
              }
              int ans=0;
              while(bfs()) ans+=dfs(s,inf);
              cout<<ans<<endl;
      }
      View Code

       

      經(jīng)過bfs分層后有123三層,從s出發(fā),只會(huì)往第二層的三個(gè)點(diǎn)依次進(jìn)行dfs。dfs手動(dòng)模擬即可理解,每次走過時(shí)記得更新殘余網(wǎng)絡(luò)。

       

      posted @ 2022-03-08 09:44  -第4題-  閱讀(41)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲午夜亚洲精品国产成人| 久久高潮少妇视频免费| 99在线 | 亚洲| 国产精品无码专区| 国产午夜免费高清久久影院| 精品人妻人人做人人爽夜夜爽| 亚洲欧洲日产国产av无码| 中文字幕久久熟女蜜桃| 国产成人99亚洲综合精品| 草草浮力影院| 久久精品国产蜜臀av| 熟妇的奶头又大又长奶水视频 | 美女一区二区三区在线观看视频| 亚洲丶国产丶欧美一区二区三区| 少妇人妻互换不带套| 久久精品国产九一九九九| 久久亚洲精品11p| 日本高清一区免费中文视频| 9lporm自拍视频区| 欧美日韩视频综合一区无弹窗| 九九热精彩视频在线免费| 波多野结衣在线播放| 亚洲av激情一区二区三区| 久久综合伊人77777| 国内少妇偷人精品免费| 米奇亚洲国产精品思久久| 在线看免费无码的av天堂| 亚洲欧美人成人综合在线播放| 亚洲深深色噜噜狠狠网站| 国产极品粉嫩尤物一线天| 亚洲精品二区在线播放| jizzjizz日本高潮喷水| 116美女极品a级毛片| 国产大片黄在线观看| 青青国产揄拍视频| 久色伊人激情文学你懂的| 亚洲香蕉伊综合在人在线| 国产午夜精品视频在线播放| 67194亚洲无码| 亚洲欧美人成网站在线观看看| 色偷偷成人综合亚洲精品|