POJ 3680 Intervals

来源:互联网 发布:新少林五祖 知乎 编辑:程序博客网 时间:2024/05/16 12:10

把区间离散化成为几个点,因为一个区间里的点可以看成一个点,多个点的作用相当于一个点,所以把区间分解成点集合从小到大排序并且重新编号,然后把所有区间首尾在新数组里的位置找出来,然后建立一条,注意,这里求最大值,所以把边改为负的,然后就是最小费用问题,因为每条边流k次,所以,把i和i+1建立一条流量为k费用为0的边,

因为一条边从起点开始流时主干道只能流k-1,而终点是又流了回来,所以还是k条边。

#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<vector>#include<queue>#include<queue>#define inf 0x3f#define maxn 405using namespace std;struct pi{    int to;    int cap;    int cost;    int rev;};struct ppi{    int a;    int b;    int cc;}pp1[maxn];vector<pi>g[maxn];int dis[maxn];int pre[maxn],pree[maxn];int sink,source;int vis[maxn];int a[maxn];void add(int a,int b,int cap,int cost){    pi pp;    pp.to=b;    pp.cap=cap;    pp.cost=cost;    pp.rev=(int)g[b].size();    g[a].push_back(pp);    pp.to=a;    pp.cap=0;    pp.cost=-cost;    pp.rev=(int)g[a].size()-1;    g[b].push_back(pp);    return ;}int spfa(void){    int i,p,k;    memset(dis,0x3f ,sizeof(dis));    memset(vis,0,sizeof(vis));    memset(pre,-1,sizeof(pre));    memset(pree,-1,sizeof(pree));    dis[source]=0;    vis[source]=1;    queue<int>q;    pi pp;    q.push(source);    while(!q.empty())    {        p=q.front();        k=(int)g[p].size();        q.pop();        vis[p]=0;        if(p==sink)            continue;        for(i=0;i<k;i++)        {            pp=g[p][i];            if(pp.cap>0&&dis[pp.to]>dis[p]+pp.cost)            {                dis[pp.to]=dis[p]+pp.cost;                pre[pp.to]=p;                pree[pp.to]=i;                if(!vis[pp.to])                {                    q.push(pp.to);                    vis[pp.to]=1;                }            }        }    }    return pre[sink]!=-1;}int min(int a,int b){    int p;    p=a;    if(b<a)        p=b;    return p;}int minflow(void){    int i,f;    int res=0;    while(spfa())    {        f=inf;        for(i=sink;i!=source;i=pre[i])        {            f=min(f,g[pre[i]][pree[i]].cap);        }        res+=f*dis[sink];        for(i=sink;i!=source;i=pre[i])        {            pi &e=g[pre[i]][pree[i]];            e.cap-=f;            g[i][e.rev].cap+=f;        }    }    return res;}int main(){    int i,j,n,m,p,k,t,tot;    cin>>t;    while(t--){        cin>>n>>k;        for(i=0;i<=403;i++)            g[i].clear();        tot=0;        for(i=0;i<n;i++){            scanf("%d%d%d",&pp1[i].a,&pp1[i].b,&pp1[i].cc);            a[tot++]=pp1[i].a;            a[tot++]=pp1[i].b;        }        m=0;        sort(a,a+tot);        m=0;        for(i=0;i<tot;i++){            if(i<tot-1&&a[i]==a[i+1]){                while(i<tot-1&&a[i]==a[i+1])                    i++;            }            a[m++]=a[i];        }        for(i=1;i<m;i++)            add(i,i+1,k,0);        for(i=0;i<n;i++){            p=lower_bound(a,a+m,pp1[i].a)-a;            j=lower_bound(a,a+m,pp1[i].b)-a;            add(p+1,j+1,1,-pp1[i].cc);        }        add(0,1,k,0);        add(m,m+1,k,0);        source=0;        sink=m+1;        printf("%d\n",-minflow());    }    return 0;}


0 0
原创粉丝点击