bzoj3876: [Ahoi2014&Jsoi2014]支線劇情(上下界費用流)

來源:互聯網
上載者:User

標籤:時間   cstring   clu   test   def   while   lin   ||   http   

傳送門

 

一道題讓我又要學可行流又要學zkw費用流……

考慮一下,原題可以轉化為一個有向圖,每次走一條路徑,把每一條邊都至少覆蓋一次,求最小代價

因為一條邊每走過一次,就要付出一次代價

那不就是費用流了麼

我們定義每走一次都會對一條邊增加1的流量,1然後費用為時間

那麼把下界設為1,上界設為inf,跑一個最小費用可行流就可以了

ps:不會可行流的可以去看看這個部落格,我覺得寫得很不錯->這裡

 1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 #define inf 0x3f3f3f3f 7 using namespace std; 8 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++) 9 char buf[1<<21],*p1=buf,*p2=buf;10 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}11 inline int read(){12     #define num ch-‘0‘13     char ch;bool flag=0;int res;14     while(!isdigit(ch=getc()))15     (ch==‘-‘)&&(flag=true);16     for(res=num;isdigit(ch=getc());res=res*10+num);17     (flag)&&(res=-res);18     #undef num19     return res;20 }21 const int N=505,M=100005;22 int head[N],Next[M],ver[M],edge[M],flow[M],tot=1;23 int dis[N],vis[N],S,T,ans;24 queue<int> q;25 inline void add(int u,int v,int e,int f){26     ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e,flow[tot]=f;27     ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=-e,flow[tot]=0;28 }29 bool spfa(){30     memset(dis,-1,sizeof(dis));31     memset(vis,0,sizeof(vis));32     q.push(T),dis[T]=0,vis[T]=1;33     while(!q.empty()){34         int u=q.front();q.pop();vis[u]=0;35         for(int i=head[u];i;i=Next[i])36         if(flow[i^1]){37             int v=ver[i],e=edge[i];38             if(dis[v]<0||dis[v]>dis[u]-e){39                 dis[v]=dis[u]-e;40                 if(!vis[v]) vis[v]=1,q.push(v);41             }42         }43     }44     return ~dis[S];45 }46 int dfs(int u,int limit){47     if(!limit) return 0;48     if(u==T) return vis[T]=1,limit;49     int fl=0,f;vis[u]=1;50     for(int i=head[u];i;i=Next[i]){51         int v=ver[i];52         if(dis[v]==dis[u]-edge[i]&&!vis[v]&&(f=dfs(v,min(limit,flow[i])))){53             fl+=f,limit-=f;54             ans+=f*edge[i];55             flow[i]-=f,flow[i^1]+=f;56             if(!limit) break;57         }58     }59     return fl;60 }61 void zkw(){62     while(spfa()){63         vis[T]=1;64         while(vis[T])65         memset(vis,0,sizeof(vis)),dfs(S,inf);66     }67 }68 int d[N],n;69 int main(){70     //freopen("testdata.in","r",stdin);71     n=read();72     for(int i=1;i<=n;++i){73         int t=read();74         while(t--){75             int x=read(),y=read();76             --d[i],++d[x],ans+=y;77             add(i,x,y,inf);78         }79     }80     S=0,T=n+2;81     for(int i=2;i<=n;++i) add(i,n+1,0,inf);82     for(int i=1;i<=n;++i){83         if(d[i]>0)add(S,i,0,d[i]);84         if(d[i]<0)add(i,T,0,-d[i]);85     }86     add(n+1,1,0,inf);87     zkw();88     printf("%d\n",ans);89     return 0;90 }

 

bzoj3876: [Ahoi2014&Jsoi2014]支線劇情(上下界費用流)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.