# 洛谷P3357 最长k可重线段集问题(费用流)

## 输入输出样例

4 2
1 2 7 3
6 5 8 3
7 8 10 5
9 6 13 9 

17

## 说明

1\leq n\leq5001≤n≤500

1 \leq k \leq 131≤k≤13

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
#include<cmath>
#define int long long
using namespace std;
const int MAXN=1e5+10;
const int INF=1e8+10;
{
char c=getchar();int x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int N,K,S,T;
int anscost=0;
struct node
{
int u,v,w,f,nxt;
}edge[MAXN];
inline void add_edge(int x,int y,int z,int f)
{
edge[num].u=x;
edge[num].v=y;
edge[num].w=z;
edge[num].f=f;
}
int Pre[MAXN],vis[MAXN],dis[MAXN];
bool SPFA()
{
queue<int>q;
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
dis[S]=0;
q.push(S);
while(q.size()!=0)
{
int p=q.front();q.pop();
vis[p]=0;
{
if(dis[edge[i].v]>dis[p]+edge[i].w&&edge[i].f)
{
dis[edge[i].v]=dis[p]+edge[i].w;
Pre[edge[i].v]=i;
if(!vis[edge[i].v])
vis[edge[i].v]=1,q.push(edge[i].v);
}
}
}
return dis[T]<=INF;
}
void f()
{
int nowflow=INF;
for(int now=T;now!=S;now=edge[Pre[now]].u)
nowflow=min(nowflow,edge[Pre[now]].f);
for(int now=T;now!=S;now=edge[Pre[now]].u)
edge[Pre[now]].f-=nowflow,
edge[Pre[now]^1].f+=nowflow;
anscost+=nowflow*dis[T];
}
void MCMF()
{
int ans=0;
while(SPFA())
f();
printf("%lld\n",-anscost);
}
int L[MAXN],R[MAXN],date[MAXN],tot=0;
struct Point
{
int xx1,yy1,xx2,yy2,L;
}P[MAXN];
double GetL(int n)
{
return floor((double)sqrt((P[n].xx1-P[n].xx2)*(P[n].xx1-P[n].xx2) + (P[n].yy1-P[n].yy2)*(P[n].yy1-P[n].yy2)));
}
main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#else
#endif
for(int i=1;i<=N;i++)
{
if(P[i].xx1>P[i].xx2)
swap(P[i].xx1,P[i].xx2),
swap(P[i].yy1,P[i].yy2);
P[i].L=GetL(i);
P[i].xx1*=2;
P[i].xx2*=2;
if(P[i].xx1==P[i].xx2) P[i].xx1--;
else P[i].xx1++;
date[++tot]=P[i].xx1,date[++tot]=P[i].xx2;
}

sort(date+1,date+tot+1);
int num=unique(date+1,date+tot+1)-date-1;
for(int i=1;i<=num-1;i++)
for(int i=1;i<=N;i++)
{
P[i].xx1=lower_bound(date+1,date+num+1,P[i].xx1)-date;

P[i].xx2=lower_bound(date+1,date+num+1,P[i].xx2)-date;

}
S=0,T=num*2;
MCMF();
return 0;
}

1811 篇文章121 人订阅

0 条评论

## 相关文章

### 第12周Python学习周记

>>> b = a                                #没有创建新的对象

12820

### 洛谷 P1019 单词接龙【经典DFS，温习搜索】

P1019 单词接龙 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏，现在我们已知一组单词，且给定一个开头的字母，要求出以这个字母开头的最长的“龙”...

39160

17940

12730

### 1212: [HNOI2004]L语言

1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 643  Solved...

30250

35650

### numpy: np.where

Note : 不接受 list 型的参数，只接受 `ndarray 型输入。

13830

### C编程笔记

1.编译命令gcc test.c -o test 带上参数o就是指定编译文件名 2.printf(“%.2lf”,b) 其中前面2是小数点后位数，l是字母...

37450

35640

### Leetcode 31 Next Permutation

Implement next permutation, which rearranges numbers into the lexicographically...

20950