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
- POJ 3680 Intervals
- poj 3680 intervals
- POJ-3680-Intervals
- poj 3680 Intervals
- POJ 3680 Intervals
- POJ 3680 Intervals
- poj 3680 intervals
- POJ 3680 Intervals
- POJ 3680 Intervals 笔记
- POJ 3680 Intervals
- poj 3680 Intervals 费用流
- poj 3680 Intervals 费用流
- 【网络流】 POJ 3680 Intervals
- poj 3680 Intervals(费用流)
- [费用流] POJ 3680 Intervals
- poj 3680 Intervals 经典的建图!
- 【POJ】 3680 Intervals 离散 + 费用流
- POJ 3680 Intervals(最小费用流)
- codeforce 9A
- 对《C和指针》及《编码:藏匿在计算机软硬件背后的语言》两本书籍的看法
- 最短路算法
- codeforce 9C 找规律的思维题
- Java异常处理终结篇——如何进行Java异常处理设计
- POJ 3680 Intervals
- 十大要避免的Ext JS开发方法
- 设计模式——三大工厂模式
- 【Espruino】NO.09 使用SPI操作Sharp Memory LCD
- 29岁为什么还那么短视呢?
- Swift Research Link
- 使用支付宝 手机转账服务 收款只要回短信
- 带头结点的单链表的12个基本操作(C++)
- 常见的CPU访问引起的内存保护问题为什么只用event_122上报 - 2