Gym - 101667E:How Many to Be Happy? (dinic 알고리즘 최소 화)

1659 단어 널빤지
[문제 풀이]
제목: 무 방향 연결 도 를 지정 하여 H (e) 를 변 e 가 연 결 된 그림 의 최소 생 성 트 리 에 삭제 해 야 할 최소 변 수 를 포함 하도록 합 니 다.
사고: 최소 생 성 트 리 를 구성 하려 면 우 리 는 먼저 가장 작은 변 을 선택 한 다음 에 비교적 큰 변 을 선택해 야 한다. 이것 이 바로 최소 생 성 트 리 의 Kruskal 알고리즘 이다.그러면 e 가 u, v 두 점 을 연결 할 때 우 리 는 u 를 연결 해 야 한다. v 의 가장 짧 은 변 은 e 이다. 최소 생 성 트 리 에 e 를 포함 하 는 것 을 확보 할 수 있다. 그래서 우 리 는 e 의 두 점 을 원점 과 합류 점 으로 하고 최소 절단, 즉 H (e) 를 뛰 어 내 려 마지막 에 화 해 를 구하 면 된다.
【 코드 】
#include
using namespace std;
const int inf=0x3f3f3f3f;
const int N=105,M=1005;
int n,m,head[N],cnt;
int from[M],to[M],flow[M];
struct node{
	int u,v,w;
}a[M];
void addedge(int u,int v,int f)
{
	from[cnt]=head[u];
	to[cnt]=v;
	flow[cnt]=f;
	head[u]=cnt++;
}
queue  Q;
int level[N];
int bfs(int S,int T)
{
	while(!Q.empty()) Q.pop();
	memset(level,0,sizeof(level));
	level[S]=1;
	Q.push(S);
	while(!Q.empty()){
		int u=Q.front();
		for(int i=head[u];i!=-1;i=from[i]){
			int v=to[i];
			if(!flow[i]||level[v]) continue;
			level[v]=level[u]+1;
			Q.push(v);
			if(v==T) return 1;
		}
		Q.pop();
	}
	return 0;
}
int dfs(int u,int minf,int T)
{
	if(u==T) return minf;
	int res=0;
	for(int i=head[u];i!=-1;i=from[i]){
		int v=to[i];
		if(level[v]!=level[u]+1||!flow[i]) continue;
		int tmp=dfs(v,min(minf,flow[i]),T);
		minf-=tmp,res+=tmp;
		flow[i]-=tmp,flow[i^1]+=tmp;
		if(minf==0) return res;
	}
	level[u]=0;
	return res;
}
int dinic(int S,int T)
{
	for(int i=0;i

[문제 면]
How Many to Be Happy?

좋은 웹페이지 즐겨찾기