poj 3680 Intervals

来源:互联网 发布:淘宝不能上传新图片 编辑:程序博客网 时间:2024/06/04 18:27

对于每个区间的端点进行保存,用set容器来保存点,任意相邻的点之间连(k,0)的线,对于输入的点连接(1,-w)的线,即离散化整个输入区间。


#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <set>using namespace std;struct node{int u,v,cost,flow,next;};struct Line{int start;int end;int w;}line[405];const int INF=1000000;node edges[1000005];const int maxn = 10005;int head[maxn],e;int pre[maxn],in[maxn],cost[maxn],flow[maxn];int s,t;queue<int> Q;int g[105][105],n,m,K;void add(int u,int v,int flow,int cost){edges[e].u=u;edges[e].v=v;edges[e].cost=cost;edges[e].flow=flow;edges[e].next=head[u];head[u]=e++;}void Add(int u,int v,int flow,int cost){add(u,v,flow,cost);add(v,u,0,-cost);}int SPFA(int s,int t){int i,u,v;memset(pre,-1,sizeof(pre));memset(flow,0,sizeof(flow));memset(in,0,sizeof(in));for(i=0;i<=t;i++) cost[i]=INF;while(!Q.empty()) Q.pop();Q.push(s);in[s]=1;flow[s]=INF;cost[s]=0;while(!Q.empty()){u=Q.front();Q.pop();in[u]=0;for(i=head[u];i!=-1;i=edges[i].next){v=edges[i].v;if(edges[i].flow>0&&cost[v]>cost[u]+edges[i].cost){cost[v]=cost[u]+edges[i].cost;pre[v]=i;flow[v]=min(flow[u],edges[i].flow);if(!in[v]){in[v]=1;Q.push(v);}}}}return flow[t];}int MCMF(int s,int t){int mincost=0,minflow,i;while((minflow=SPFA(s,t))){for(i=pre[t];i!=-1;i=pre[edges[i].u]){mincost+=minflow*edges[i].cost;edges[i].flow-=minflow;edges[i^1].flow+=minflow;}}return mincost;}set<int> dot;int main(){int p;for(scanf("%d",&p);p;p--){memset(head,-1,sizeof(head));int k,u,v,w;scanf("%d %d",&n,&k);dot.clear();for(int i = 1;i<=n;i++){scanf("%d %d %d",&u,&v,&w);line[i].start = u;line[i].end = v;line[i].w = -w;dot.insert(u);dot.insert(v);}s = 0;for(int i = 1;i<dot.size();i++){Add(i,i+1,k,0);}int tmp = 0;for(int i = 1;i<=n;i++){int ss,ee;int j = 0;for(set<int>::iterator it = dot.begin();it!=dot.end();it++,j++){if(*it==line[i].start){ss = j+1;}if(*it==line[i].end){ee = j+1;}}if(ss!=ee)Add(ss,ee,1,line[i].w);elsetmp += line[i].w;}s = 0;Add(s,1,k,0);t = dot.size()+1;Add(dot.size(),t,k,0);int ans = MCMF(s,t);ans += tmp;printf("%d\n",-ans);}return 0;}


原创粉丝点击