poj 3680 intervals
来源:互联网 发布:淘宝访客量有什么用 编辑:程序博客网 时间:2024/05/21 08:36
ti
#include <iostream>#include <algorithm>#include <string>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <queue>#include <vector>#include <cmath>#include <map>#include <set>using namespace std;int sumFlow;const int MAXN = 10010;const int MAXM = 1000200;const int INF = 1000000000;struct Edge{ int u, v, cap, cost; int next;}edge[MAXM<<2];int NE;int head[MAXN], dist[MAXN], pp[MAXN];bool vis[MAXN];void init(){ NE = 0; memset(head, -1, sizeof(head));}void addedge(int u, int v, int cap, int cost){ edge[NE].u = u; edge[NE].v = v; edge[NE].cap = cap; edge[NE].cost = cost; edge[NE].next = head[u]; head[u] = NE++; edge[NE].u = v; edge[NE].v = u; edge[NE].cap = 0; edge[NE].cost = -cost; edge[NE].next = head[v]; head[v] = NE++;}bool SPFA(int s, int t, int n){ int i, u, v; queue <int> qu; memset(vis,false,sizeof(vis)); memset(pp,-1,sizeof(pp)); for(i = 0; i <= n; i++) dist[i] = INF; vis[s] = true; dist[s] = 0; qu.push(s); while(!qu.empty()) { u = qu.front(); qu.pop(); vis[u] = false; for(i = head[u]; i != -1; i = edge[i].next) { v = edge[i].v; if(edge[i].cap && dist[v] > dist[u] + edge[i].cost) { dist[v] = dist[u] + edge[i].cost; pp[v] = i; if(!vis[v]) { qu.push(v); vis[v] = true; } } } } if(dist[t] == INF) return false; return true;}int MCMF(int s, int t, int n) // minCostMaxFlow{ int flow = 0; // 总流量 int i, minflow, mincost; mincost = 0; while(SPFA(s, t, n)) { minflow = INF + 1; for(i = pp[t]; i != -1; i = pp[edge[i].u]) if(edge[i].cap < minflow) minflow = edge[i].cap; flow += minflow; for(i = pp[t]; i != -1; i = pp[edge[i].u]) { edge[i].cap -= minflow; edge[i^1].cap += minflow; } mincost += dist[t] * minflow; } sumFlow = flow; // 最大流 return mincost;}int ina[401],inb[401],inw[401];map<int,int>mymap;set<int>myset;set<int>::iterator it,te;int main(){ int sec; int n,k; scanf("%d",&sec); for(int z=1;z<=sec;z++) { scanf("%d%d",&n,&k); myset.clear(); mymap.clear(); init(); for(int i=1;i<=n;i++) { scanf("%d%d%d",&ina[i],&inb[i],&inw[i]); myset.insert(ina[i]); myset.insert(inb[i]); } int num=0; for(it=myset.begin();it!=myset.end();it++) { num++; mymap[*it]=num; te=it;te++; if(te!=myset.end())addedge(num,num+1,k,0); } for(int i=1;i<=n;i++) { int x=mymap[ina[i]],y=mymap[inb[i]]; addedge(x,y,1,-inw[i]); } addedge(0,1,k,0); addedge(num,num+1,k,0); int ans=MCMF(0,num+1,num+1); printf("%d\n",-ans); } return 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(最小费用流)
- 10330 - Power Transmission
- Python 使用xlwt模块操作Excel写
- iOS之exit(0)动画退出应用程序
- 广告图片动态显示
- 杭电ACM 2014 青年歌手大奖赛_评委会打分
- poj 3680 intervals
- 11045 - My T-shirt suits me
- 输出二叉树第 m 层的第 k 个节点值
- 防止内容被COPY
- Mybatis学习总结
- 50个java编程程序之三
- C++课程得遇好闺女的关心
- clementine 中缺失值的处理
- 75道逻辑推理题<一>