zoukankan      html  css  js  c++  java
  • 「网络流 24 题」太空飞行计划问题

    Question

    哪儿都有

    Solution

    一眼最小割。
    1.S连向实验,边权为实验费用
    2.实验连向仪器,边权无穷大,因为不能割。
    3.仪器连向T,边权为仪器费用
    跑一遍网络流即可。

    Code

    #include<cstdio>
    #include<algorithm>
    #define N 10010
    using namespace std;
    struct node{int v,fr,c;}e[N<<1];
    int tail[N],dis[N],gap[N],ans=0;
    int n,m,x,y,S=0,T,cnt=1;
    bool flag,vis[N];
    
    inline int read()
    {
    	int x=0,f=0; char c=getchar();
    	while (c<'0' || c>'9') f=(c=='-') ? 1:f,c=getchar();
    	while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
    	if (c=='
    ' || c=='
    ') flag=1;
    	return f ? -x:x;
    }
    
    inline void add(int u,int v,int c)
    {
    	e[++cnt]=(node){v,tail[u],c}; tail[u]=cnt;
    	e[++cnt]=(node){u,tail[v],0}; tail[v]=cnt;
    }
    
    int dfs(int x,int hav)
    {
    	if (x==T) return hav;
    	int gone=0;
    	for (int p=tail[x],v,can;p;p=e[p].fr)
    	{
    		v=e[p].v;
    		if (dis[x]!=dis[v]+1) continue;
    		can=dfs(v,std::min(hav-gone,e[p].c));
    		e[p].c-=can,e[p^1].c+=can,gone+=can;
    		if (gone==hav) return gone;
    	}
    	gap[dis[x]]--;
    	if (!gap[dis[x]]) dis[1]=T;
    	gap[++dis[x]]++;
    	return gone;
    }
    
    void DFS(int x)
    {
    	vis[x]=1;
    	for (int p=tail[x];p;p=e[p].fr)
    		if (!vis[e[p].v] && e[p].c) DFS(e[p].v);
    }
    
    int main()
    {
    	freopen("space.in","r",stdin);
    	freopen("space.out","w",stdout);
    	m=read(),n=read();T=n+m+1;
    	for (int i=1;i<=m;i++)
    	{
    		x=read(),add(S,i,x);
    		flag=0;ans+=x;
    		while (!flag) y=read(),add(i,m+y,1010580540);
    	}
    	for (int i=1;i<=n;i++)
    		x=read(),add(m+i,T,x);
    	while (dis[1]<T) ans-=dfs(S,1010580540);
    	DFS(S);
    	x=1; while (!vis[x]) x++;
    	printf("%d",x);
    	for (int i=x+1;i<=m;i++)
    		if (vis[i]) printf(" %d",i);
    	x=m+1; while (!vis[x]) x++;
    	printf("
    %d",x-m);
    	for (int i=x+1;i<=m+n;i++)
    		if (vis[i]) printf(" %d",i-m);
    	printf("
    %d",ans);
    	return 0;
    }
    
    转载需注明出处。
  • 相关阅读:
    10 个雷人的注释,就怕你不敢用!
    Java 14 之模式匹配,非常赞的一个新特性!
    poj 3661 Running(区间dp)
    LightOJ
    hdu 5540 Secrete Master Plan(水)
    hdu 5584 LCM Walk(数学推导公式,规律)
    hdu 5583 Kingdom of Black and White(模拟,技巧)
    hdu 5578 Friendship of Frog(multiset的应用)
    hdu 5586 Sum(dp+技巧)
    hdu 5585 Numbers
  • 原文地址:https://www.cnblogs.com/jz929/p/11817526.html
Copyright © 2011-2022 走看看