[POI2006]Szk-Schools 最小费用最大流

[POI2006]Szk-Schools 最小费用最大流

题意就是N个学校,每个学校有一个编号,编号可以重复。现在要求每个学校有一个独立的编号,但是每个学校可以接受的编号有一个范围,在这个范围内,编号每变动1将付出的话费是D。求是否有可行方案并给出最小花费。
显然X部分是所有的学校,Y部分是新的编号,按顺序我们把学校设置成1—N,设置超级源点s,s向每个X侧的节点连一条费用是0,流量是1的边,把他们对应的编号设置成节点N+1- 2*N,X部和Y部的边用计算出来的花费连边,流量是1,Y部每个节点向t连一条费用是0流量是1的边,求最小费用最大流即可。

模板就不贴了,构图部分代码如下:
void  creat( int  n, int  s, int  t)
{
    flowsum
=0;
    
int a,b,c,d;
    
int i;

    
for(i=1;i<=n;i++)
    
{
        insert(s,i,
1,0);
        insert(i
+n,t,1,0);

        scanf(
"%d%d%d%d",&a,&b,&c,&d);
        
int j;
        
for(j=b;j<=c;j++)
        
{
            insert(i,j
+n,1,abs(j-a)*d);
        }

    }


    
}


void  init( int  n)
{
    
int i;
    
for(i=0;i<n;i++)
        adj[i]
=NULL;
    len
=0;
}


int  main()
{

    
int n;
    
int s,t;

    scanf(
"%d",&n);
    init(
2*n+2);
    s
=0;
    t
=2*n+1;
    creat(n,s,t);
    
int ans=mincostflow(t+1,s,t);
    
if(flowsum!=n)
        printf(
"NIE\n");
    
else
        printf(
"%d\n",ans);
    
return 0;
}

你可能感兴趣的:([POI2006]Szk-Schools 最小费用最大流)