poj 3680 Intervals (最小费用最大流)
来源:互联网 发布:传奇挂机软件 编辑:程序博客网 时间:2024/04/30 09:31
建图,先将0到1,,1到2,2到3,,,N到N+1之间都建立费用为0容量为k的边。
再将输入进来的a和b之前建立容量为1费用为-w的边。
建图之后就是最小费用最大流了。
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#define maxnode 50005#define maxedge 20005using namespace std;int t,s;struct A{ int num,loc;}arr[4005];bool cmp(A a,A b){ return a.num<b.num;}struct B{ int a,b,w;}line[maxedge];struct EDGE{ int st,to,next,cf,w;}edge[maxedge];int head[maxnode],e;void addedge(int u,int v,int val,int w){ edge[e].st=u; edge[e].to=v; edge[e].next=head[u]; edge[e].cf=val; edge[e].w=w; head[u]=e++; edge[e].st=v; edge[e].to=u; edge[e].next=head[v]; edge[e].cf=0; edge[e].w=-w; head[v]=e++;}int q[maxnode],qsize,dis[maxnode],pre[maxnode],flow[maxnode];bool vis[maxnode];bool spfa(){ //memset(vis,0,sizeof(vis)); memset(dis,127,sizeof(dis)); memset(pre,-1,sizeof(pre)); int i,v,u,j; qsize=0; dis[s]=0; q[qsize++]=s; vis[s]=1; flow[s]=999999999; for(i=0;i<qsize;i++){ u=q[i]; vis[u]=0;//注意spfa出队时要把标记置为0,之前忘写了,结果一直T for(j=head[u];j!=-1;j=edge[j].next){ v=edge[j].to; if(edge[j].cf>0 && dis[v]>dis[u]+edge[j].w){ dis[v]=dis[u]+edge[j].w; pre[v]=j; flow[v]=min(flow[u],edge[j].cf); if(!vis[v]){ vis[v]=1; q[qsize++]=v; } } } } return pre[t]!=-1;}int solve(){ int ret=0; while(spfa()){ int tmp=t; while(tmp!=s){ edge[pre[tmp]].cf-=flow[t]; edge[pre[tmp]^1].cf+=flow[t]; tmp=edge[pre[tmp]].st; } ret+=dis[t]; } return ret;}int main(){ int T; scanf("%d",&T); while(T--){ int n,k,i,a,b,w,ct=0; e=0; memset(head,-1,sizeof(head)); scanf("%d%d",&n,&k); s=0; for(i=1;i<=n;i++){ scanf("%d%d%d",&a,&b,&w); arr[ct].num=a; arr[ct++].loc=-i; arr[ct].loc=i; arr[ct++].num=b; line[i].w=w; } sort(arr,arr+ct,cmp); int tmp=-1,number=0; for(i=0;i<ct;i++){ if(arr[i].num!=tmp){ number++; tmp=arr[i].num; } if(arr[i].loc<0){ line[-arr[i].loc].a=number; } else{ line[arr[i].loc].b=number; } } for(i=1;i<=n;i++){ addedge(line[i].a,line[i].b,1,-line[i].w); } for(i=0;i<=number;i++){ addedge(i,i+1,k,0); } t=number+1; int ans=solve(); printf("%d\n",-ans); } return 0;}
0 0
- poj 3680 Intervals (最小费用最大流)
- Intervals poj 3680 最小费用最大流
- POJ Intervals (最小费用最大流)
- POJ 3680 Intervals (最小费用最大流+离散化)
- Intervals (poj 3680 离散化+最小费用最大流)
- POJ 3680 Intervals(最小费用流)
- POJ 3680 Intervals(最小费用流)
- poj 3680 Intervals 最大费用流
- POJ 3690 Intervals 费用流 最大变最小
- POJ 3680 Intervals (最大费用最大流)
- 【POJ3680】Intervals 最小费用最大流
- poj 3680 Intervals(最大费用流+离散化)
- POJ 3680Intervals (拆点 || 离散) && 最大费用流
- poj/pku 3680(最小费用最大流)
- POJ 3680 最小费用最大流
- poj 3680(最小费用最大流)
- POJ 3680 最小费用最大流
- POJ 3680 最小费用最大流
- 怎样给Myeclipse配置tomcat服务器
- Android PreferenceActivity点击Header是如何处理的?
- 使用Scala操作Mongodb
- 深入理解typedef
- 音视频同步-时间戳
- poj 3680 Intervals (最小费用最大流)
- java中final的使用
- 学会Settings必看
- win64上 tortoisesvn的安装和使用
- Wireshark基本介绍和学习TCP三次握手
- 树莓派的.bashrc和.bash_aliases文件
- 浅谈Java中的hashcode方法
- 善于指针---使用返回指针值的函数
- 斐波那契改进