luogu P2764 最小路径覆盖问题

DAG的最小不相交路径覆盖板子

#include<bits/stdc++.h>
using namespace std;
int ans=0,len=0,lin[500],din[50000],dout[50000],level[500],x,y,S,T,n,m,q[500];
int q1[500],q2[500],tail1=0,tail2=0;
bool f[500];
struct one
{
	int x,y,v,next,reverse;
};
one e[30000];
void insert(int xx,int yy)
{
	e[++len].next=lin[xx];
	lin[xx]=len;
	e[len].x=xx;
	e[len].y=yy;
	e[len].v=1;
	e[len].reverse=len+1;
	e[++len].next=lin[yy];
	lin[yy]=len;
	e[len].x=yy;
	e[len].y=xx;
	e[len].v=0;
	e[len].reverse=len-1;
}
bool makelevel()
{
	memset(level,-1,sizeof(level));
	level[0]=0;
	q[1]=0;
	int head=0,tail=1,tn,ty;
	while(head++<tail)
	{
		tn=q[head];
		for(int i=lin[tn];i;i=e[i].next)
		{
			ty=e[i].y;
			if(level[ty]<0&&e[i].v>0)
			{
				level[ty]=level[tn]+1;
				q[++tail]=ty;
			}
		}
	}
	return level[T]>=0;
}
int MAXflow(int aa,int flow)
{
	if(aa==T)return flow;
	int maxflow=0,d;
	for(int i=lin[aa];maxflow<flow&&i;i=e[i].next)
	{
		if(level[e[i].y]==level[aa]+1&&e[i].v>0)
		{
			d=MAXflow(e[i].y,min(e[i].v,flow-maxflow));
			e[i].v-=d;
			e[e[i].reverse].v+=d;
			maxflow+=d;
		}
	}
	if(maxflow<=0)level[aa]=-1;
	return maxflow;
}
void work(int p)
{
	tail1=0;tail2=1;
	f[p]=true;
	q2[tail2]=p;
	int xx=p;
	while(din[p])
	{
		q1[++tail1]=din[p];
		p=din[p];
		f[p]=true;
	}
	p=xx;

	while(dout[p])
	{
		q2[++tail2]=dout[p];
		p=dout[p];
		f[p]=true;
	}
	for(int i=tail1;i>=1;i--)
		printf("%d ",q1[i]);
	for(int i=1;i<tail2;i++)
		printf("%d ",q2[i]);
	printf("%d\n",q2[tail2]);
}
void dinic()
{
	int d;
	while(makelevel())
		while(d=MAXflow(S,99999999))
			ans+=d;
	for(int i=1;i<=m*2;i+=2)
	{
		if(e[i].v<=0)
		{
			din[(e[i].y+1)/2]=(e[i].x+1)/2;
			dout[(e[i].x+1)/2]=(e[i].y+1)/2;
		}
	}
	for(int i=1;i<=n;i++)if(!f[i])work(i);
}
int main()
{
	scanf("%d%d",&n,&m);
	S=0;T=n*2+1;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		insert(x*2-1,y*2);
	}
	for(int i=1;i<=n;i++)
	{
		insert(S,i*2-1);
		insert(i*2,T);
	}
	dinic();
	printf("%d\n",n-ans);
	return 0;
}

  

原文地址:https://www.cnblogs.com/mybing/p/9050145.html

时间: 2024-11-02 14:26:07

luogu P2764 最小路径覆盖问题的相关文章

luogu 2764 最小路径覆盖问题 | 最大匹配

luogu 2764 最小路径覆盖 = n - 最大匹配 1 #include <cstdio> 2 #include <string> 3 #include <vector> 4 #include <queue> 5 #include <cstring> 6 7 const int N = 200, INF = 0x3f3f3f3f; 8 9 int read() { 10 int x = 0, f = 1; 11 char c = getch

P2764 最小路径覆盖问题(网络流24题之一)

题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0.G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G 的最小路径覆盖.提示:设V={1,2,.... ,n},构造网络G1=(V1,E1)如下: 每条边的容量均为1.求网络G1的( 0 x , 0 y )最大流. «编程任务:

洛谷 P2764 最小路径覆盖问题【匈牙利算法】

经典二分图匹配问题.把每个点拆成两个,对于原图中的每一条边(i,j)连接(i,j+n),最小路径覆盖就是点数n-二分图最大匹配.方案直接顺着匹配dsf.. #include<iostream> #include<cstdio> using namespace std; const int N=505,M=120005; int n,m,h[N],cnt,lk[N],t,v[N],ans; struct qwe { int ne,to; }e[M]; int read() { int

P2764 最小路径覆盖问题

题目描述 ?问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0.G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G 的最小路径覆盖.提示:设V={1,2,.... ,n},构造网络G1=(V1,E1)如下: 每条边的容量均为1.求网络G1的( 0 x , 0 y )最大流. ?编程任务:

洛谷 P2764 LibreOJ 6002 最小路径覆盖问题

题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0.G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G 的最小路径覆盖.提示:设V={1,2,.... ,n},构造网络G1=(V1,E1)如下: 每条边的容量均为1.求网络G1的( 0 x , 0 y )最大流. «编程任务:

最小路径覆盖问题(网络流,二分图) &amp; 最小路径点覆盖结论证明

最小路径覆盖问题(luogu) 题目描述 给定有向图 G=(V,E) .设 P 是 G 的一个简单路(顶点不相交)的集合. 如果 V 中每个定点恰好在PP的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何一个定点开始,长度也是任意的,特别地,可以为 0 . G 的最小路径覆盖是 G 所含路径条数最少的路径覆盖.设计一个有效算法求一个 GAP (有向无环图) G 的最小路径覆盖. 输入格式 第一行有 2 个正整数 n 和 m . n 是给定 GAP(有向无环图) G 的顶

hiho 第118周 网络流四&#183;最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

hdu3861 强连通+最小路径覆盖

题意:有 n 个点,m 条边的有向图,需要将这些点分成多个块,要求:如果两点之间有路径能够互相到达,那么这两个点必须分在同一块:在同一块内的任意两点相互之间至少要有一条路径到达,即 u 到达 v 或 v 到达 u:每个点都只能存在于单独一个块内.问最少需要划分多少块. 首先,对于如果两点之间能够相互到达则必须在同一块,其实也就是在同一个强连通分量中的点必须在同一块中,所以首先就是强连通缩点.然后在同一块内的任意两点之间要有一条路,那么其实就是对于一块内的强连通分量,至少要有一条路径贯穿所有分量.

COGS728. [网络流24题] 最小路径覆盖问题

算法实现题8-3 最小路径覆盖问题(习题8-13) ´问题描述: 给定有向图G=(V,E).设P是G的一个简单路(顶点不相交)的集合.如果V中每个顶点恰好在P的一条路上,则称P是G的一个路径覆盖.P中路径可以从V的任何一个顶点开始,长度也是任意的,特别地,可以为0.G的最小路径覆盖是G的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G的最小路径覆盖. 提示: 设V={1,2,...  ,n},构造网络G1=(V1,E1)如下: 每条边的容量均为1.求网络G1的(x0,y0)最大流.