poj3680 Intervals 【最小费用最大流+离散化】
2016-05-05 19:33
295 查看
#include<stdio.h> #include<string.h> #include<vector> #include<queue> #include<algorithm> using namespace std; const int N=5024; const int inf=0x7fffffff; struct Edge { int from,to,cap,flow,cost; }; vector<Edge>edges; vector<int>G ; int inq ,p ,d ,a ; void AddEdge(int from, int to,int cap, int cost) { Edge tp; tp.from=from,tp.to=to,tp.cap=cap,tp.flow=0,tp.cost=cost; edges.push_back(tp); tp.from=to,tp.to=from,tp.cap=0,tp.flow=0,tp.cost=-cost; edges.push_back(tp); int g=edges.size(); G[from].push_back(g-2); G[to].push_back(g-1); } int BellmanFord(int s,int t,int &flow, int &cost,int n) { int i,j,u; for(i=0; i<=n+1; i++) d[i]=inf; memset(inq,0,sizeof(inq)); d[s]=0; inq[s]=1; p[s]=0; a[s]=inf; queue<int>Q; Q.push(s); while(!Q.empty()) { u=Q.front(); Q.pop(); inq[u]=0; for(i=0; i<G[u].size(); i++) { Edge &e=edges[G[u][i]]; if(e.cap>e.flow&&d[e.to]>d[u]+e.cost) { d[e.to]=d[u]+e.cost; p[e.to]=G[u][i]; a[e.to]=min(a[u],e.cap-e.flow); if(!inq[e.to]) { Q.push(e.to); inq[e.to]=1; } } } } if(d[t]==inf) return 0; flow+=a[t]; cost+=d[t]*a[t]; u=t; while(u!=0) { edges[p[u]].flow+=a[t]; edges[p[u]^1].flow-=a[t]; u=edges[p[u]].from; } return 1; } int Mincost(int s,int t,int n) { int flow=0,cost=0; while(BellmanFord(s,t,flow,cost,n)); return cost; } void init(int n) { for(int i=0; i<=n+1; i++) G[i].clear(); edges.clear(); } int main() { vector<int>x; int s,t,_,i,u,v,c,n,m,k,a[1024],b[1024],w[1024]; scanf("%d",&_); while(_--) { scanf("%d%d",&m,&k); x.clear(); for(i=0;i<m;i++) { scanf("%d%d%d",&a[i],&b[i],&w[i]); x.push_back(a[i]); x.push_back(b[i]); } sort(x.begin(),x.end()); x.erase(unique(x.begin(),x.end()),x.end()); n=x.size(); s=n;t=s+1; init(n+1); for(int i=0;i+1<n;i++) AddEdge(i,i+1,k,0); AddEdge(s,0,k,0); AddEdge(n-1,t,k,0); n++; for(i=0;i<m;i++) { a[i]=find(x.begin(),x.end(),a[i])-x.begin(); b[i]=find(x.begin(),x.end(),b[i])-x.begin(); AddEdge(a[i],b[i],1,-w[i]); } printf("%d\n",-Mincost(s,t,n)); } return 0; }
相关文章推荐
- Java强引用、软引用、弱引用和虚引用
- 18.包含min函数的栈
- js遍历函数
- 一个简单的Android聊天室
- 英文经典语录
- 归并排序
- Android Intent调用大全、系统自带Intent调用大全
- windows下opencv3.1 (3.0) 安装opencv_contrib常见问题总结
- 算法练习-归并排序
- leetcode 206 Reverse Linked List C++
- HDU 3466 Proud Merchants (01背包)
- 4. Median of Two Sorted Arrays
- MMDrawerController,最简代码实现抽屉效果
- 标准C++中的string类的用法总结
- http报文格式和post, get方式区别与误区(很不错哦)
- 匈牙利算法解决指派问题清晰流程
- android设计模式——建造者模式
- 将空格用%20替换
- 优先队列+括号配对 51Nod1476 括号序列的最小代价
- 线程间通信:生产者消费者(等待唤醒机制)