论网络流24只剩一道却死活调不出来是什么感受(逼死强迫症)
  • 板块灌水区
  • 楼主Danno0v0
  • 当前回复20
  • 已保存回复20
  • 发布时间2021/10/21 21:28
  • 上次更新2023/11/4 02:59:40
查看原帖
论网络流24只剩一道却死活调不出来是什么感受(逼死强迫症)
167279
Danno0v0楼主2021/10/21 21:28

所以……帮我调一下吧!(屑)

P3357 最长k可重线段集问题 只A了前3个点,一直都是

如图:

code:

#include<bits/stdc++.h>
#define opst 100000
#define kls 100000
using namespace std;
long long to[1000001],val[1000001],cost_[1000001],nx[1000001],fi[1000001],tot=1,vis[1000001];
long long in[1000001],dis[1000001];
long long pre[1000001],min_flow[1000001];
long long max_cost;
int all[1000001],num,qujian[1000001][5];
int duiyin[1000001];
int s,t,n,m;
queue<int>que;
void link(int a,int b,int c,int d)
{
	nx[++tot]=fi[a];
	fi[a]=tot;
	to[tot]=b;
	val[tot]=c;
	cost_[tot]=d;
}
bool spfa()
{
	memset(dis,-0x3f,sizeof(dis));
	memset(in,0,sizeof(in));
	memset(vis,0,sizeof(vis));
	que.push(s);
	in[s]=1;
	min_flow[s]=0x7ffffffff;
	dis[s]=0;
	while(!que.empty())
	{
		int x=que.front();
		que.pop();
		in[x]=0;
		vis[x]=1;
		for(int i=fi[x];i;i=nx[i])
		{
			if(!val[i])
			{continue;}
			int v=to[i];
			if(dis[v]<dis[x]+cost_[i])
			{
				dis[v]=dis[x]+cost_[i];
				min_flow[v]=min(val[i],min_flow[x]);
				pre[v]=i;
				if(!in[v])
				{
					in[v]=1;
					que.push(v);
				}
			}	
		}
	}
	if(!vis[t])
	{
		return false;
	}
	return true;   
}
void bfs()
{
	while(spfa())
	{
		long long x=t;
		max_cost+=dis[x]*min_flow[x];
		int i;
		while(x!=s)
		{
			i=pre[x];
			val[i]-=min_flow[t];
			val[i^1]+=min_flow[t];
			x=to[i^1];
		}
	}
}
bool cmp(int a,int b)
{
	return a<b;
}
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>qujian[i][0]>>qujian[i][1]>>qujian[i][2]>>qujian[i][3];
		qujian[i][0]+=kls;
		qujian[i][1]+=kls;
		qujian[i][2]+=kls;
		qujian[i][3]+=kls;
		qujian[i][4]=sqrt((qujian[i][2]-qujian[i][0])*(qujian[i][2]-qujian[i][0])+(qujian[i][3]-qujian[i][1])*(qujian[i][3]-qujian[i][1]));
		if(qujian[i][0]>qujian[i][2])
		{
			swap(qujian[i][0],qujian[i][2]);
		}
		qujian[i][0]<<=1;
		qujian[i][2]<<=1;
		if(qujian[i][0]==qujian[i][2])
		{
			qujian[i][2]++;
		}
		else
		{
			qujian[i][0]++;
		}
		all[++num]=qujian[i][0];
		all[++num]=qujian[i][2];
	}
	sort(all+1,all+num+1,cmp);
	num=unique(all+1,all+num+1)-all;
	s=0;
	t=num;
	for(int i=0;i<num;i++)
	{
		link(i,i+1,k,0);
		link(i+1,i,0,0);
		duiyin[all[i]]=i;
	}
	for(int i=1;i<=n;i++)
	{
		link(duiyin[qujian[i][0]],duiyin[qujian[i][2]],1,qujian[i][4]);
		link(duiyin[qujian[i][2]],duiyin[qujian[i][0]],0,-qujian[i][4]);
	}
	bfs();
	cout<<max_cost<<endl;
}
2021/10/21 21:28
加载中...