zoukankan      html  css  js  c++  java
  • 刷题总结——支线剧情(bzoj3876费用流)

    题目:

    【故事背景】
    宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等。不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情。这些游戏往往
    都有很多的支线剧情,现在JYY想花费最少的时间看完所有的支线剧情。
    【问题描述】
    JYY现在所玩的RPG游戏中,一共有N个剧情点,由1到N编号,第i个剧情点可以根据JYY的不同的选择,而经过不同的支线剧情,前往Ki种不同的新的剧情点。当然如果为0,则说明i号剧情点是游戏的一个结局了。
    JYY观看一个支线剧情需要一定的时间。JYY一开始处在1号剧情点,也就是游戏的开始。显然任何一个剧情点都是从1号剧情点可达的。此外,随着游戏的进行,剧情是不可逆的。所以游戏保证从任意剧情点出发,都不能再回到这个剧情点。由于JYY过度使用修改器,导致游戏的“存档”和“读档”功能损坏了,
    所以JYY要想回到之前的剧情点,唯一的方法就是退出当前游戏,并开始新的游戏,也就是回到1号剧情点。JYY可以在任何时刻退出游戏并重新开始。不断开始新的游戏重复观看已经看过的剧情是很痛苦,JYY希望花费最少的时间,看完所有不同的支线剧情。

    Input

    输入一行包含一个正整数N。
    接下来N行,第i行为i号剧情点的信息;
    第一个整数为,接下来个整数对,Bij和Tij,表示从剧情点i可以前往剧
    情点,并且观看这段支线剧情需要花费的时间。
     

    Output

     输出一行包含一个整数,表示JYY看完所有支线剧情所需要的最少时间。

     Sample Input

    6
    2 2 1 3 2
    2 4 3 5 4
    2 5 5 6 6
    0
    0
    0

    Sample Output

    24

    HINT

    JYY需要重新开始3次游戏,加上一开始的一次游戏,4次游戏的进程是

    1->2->4,1->2->5,1->3->5和1->3->6。

    对于100%的数据满足N<=300,0<=Ki<=50,1<=Tij<=300,Sigma(Ki)<=5000

    题解:

    这道题很NB····

    表面看起来如果直接按题意建图的话,会是一道有下界费用流的题···md我不会···

    但可以转成普通费用流的题····这里引用PoPoQQQ题解····%%%%%%

    对于每一条边权为z的边x->y:

    从S到y连一条费用为z,流量为1的边 代表这条边至少走一次

    从x到y连一条费用为z,流量为INF的边 代表这条边除了至少走的一次之外还可以随便走

    对于每个点x:

    从x到T连一条费用为0,流量为x的出度的边

    从x到1连一条费用为0,流量为INF的边,代替原图上的源和汇

    不得不说想到这样建图实在是太巧妙了·····

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<ctime>
    #include<cctype>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int inf=1e+8;
    const int N=5000;
    const int M=150005;
    queue<int>que;
    int tot=1,first[N],go[M],next[M],rest[M],cost[M];
    int chu[N],ans=0,dis[N],src,des,n;
    bool insta[N],visit[N];
    int R()
    {
      char c;
      int f=0;
      for(c=getchar();c<'0'||c>'9';c=getchar());
      for(;c>='0'&&c<='9';c=getchar())
        f=(f<<3)+(f<<1)+c-'0';
      return f;
    }
    inline void comb(int a,int b,int c,int d)
    {
      next[++tot]=first[a],first[a]=tot,go[tot]=b,rest[tot]=c,cost[tot]=d;
      next[++tot]=first[b],first[b]=tot,go[tot]=a,rest[tot]=0,cost[tot]=-d;
    }
    inline bool SPFA()
    {
      for(int i=src;i<=des;i++)  visit[i]=false,dis[i]=inf;
      que.push(src);
      dis[src]=0;
      while(!que.empty())
      {
        int u=que.front();
        que.pop();
        insta[u]=false;
        for(int e=first[u];e;e=next[e])
        {
          int v=go[e];
          if((dis[v]>dis[u]+cost[e])&&rest[e])
          {
            dis[v]=dis[u]+cost[e];
            if(!insta[v])
            {
              que.push(v);
              insta[v]=true;
            }
          }
        }
      }
      return dis[des]!=inf;
    }
    inline int dinic(int u,int flow)
    {
      if(u==des)
      {
        ans+=flow*dis[des];
        return flow;
      }
      visit[u]=true;
      int res=0,delta,v;
      for(int e=first[u];e;e=next[e])
      {
        if(dis[v=go[e]]==dis[u]+cost[e]&&!visit[v]&&rest[e])
        {
          delta=dinic(v,min(rest[e],flow-res));
          if(delta)
          {
            rest[e]-=delta;
            rest[e^1]+=delta;
            res+=delta;
            if(res==flow)  break;
          }
        }
      }
      return res;
    }
    inline void maxflow()
    {
      while(SPFA())  
        dinic(src,inf);
    }
    int main()
    {
      //freopen("a.in","r",stdin);
      n=R();
      int t,a,b;
      src=0,des=n+1;
      for(int i=1;i<=n;i++)
      {
        t=R();
        for(int j=1;j<=t;j++)
        {
          a=R(),b=R();
          comb(src,a,1,b);
          comb(i,a,inf,b);
        }
        chu[i]=t;
      }
      for(int i=1;i<=n;i++)
      {
        comb(i,des,chu[i],0);
        if(i!=1)
          comb(i,1,inf,0);
      }
      maxflow();
      cout<<ans<<endl;
      return 0;
    }
  • 相关阅读:
    iOS开发--CoreGraphics简单绘图
    iOS开发--UITableView
    PowerDesigner
    使用jquery-qrcode生成二维码
    MVC中如何设置路由指定默认页
    项目管理
    版本管理
    如何在网页中嵌入百度地图
    asp.net网站中添加百度地图功能
    TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端
  • 原文地址:https://www.cnblogs.com/AseanA/p/7481670.html
Copyright © 2011-2022 走看看