题解 UVA1184 【Air Raid】

有向无环图(DAG)的最小路径覆盖的模板题。

定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点。

由题意可得这是一个有向图,而路径不能相交,于是我们知道这是无向图的不相交最小路径覆盖问题

我们把所有的点拆成两个,当两点之间有路径时,我们在u与v'之间建一条容量为1的边,利用二分图的思想,最大流数即为减去的路径数。

求法:最小路径条数 = 点数 - 分裂图最大流数

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
typedef long long ll;
using namespace std;
int RD(){
    int out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
const int maxn = 10019,INF = 1e9;
int T,num,nr;
int head[maxn],nume = 1;
struct Node{
    int v,dis,nxt;
    }E[maxn << 3];
void add(int u,int v,int dis){
    E[++nume].nxt = head[u];
    E[nume].v = v;
    E[nume].dis = dis;
    head[u] = nume;
    }
int maxflow,s,t;
int d[maxn];
bool bfs(){
	queue<int>Q;
	memset(d,0,sizeof(d));
	d[s] = 1;
	Q.push(s);
	while(!Q.empty()){
		int u = Q.front();Q.pop();
		for(int i = head[u];i;i = E[i].nxt){
			int v = E[i].v;
			if(!d[v] && E[i].dis){
				d[v] = d[u] + 1;
				Q.push(v);
				if(v == t)return 1;
				}
			}
		}
	return 0;
	}
int Dinic(int u,int flow){
	if(u == t)return flow;
	int rest = flow,k;
	for(int i = head[u];i;i = E[i].nxt){
		int v = E[i].v;
		if(d[v] == d[u] + 1 && E[i].dis){
			k = Dinic(v,min(rest,E[i].dis));
			if(!k)d[v] = 0;
			E[i].dis -= k;
			E[i ^ 1].dis += k;
			rest -= k;
			}
		if(!rest)break;
		}
	return flow - rest;
	}
void init(){
	memset(head,0,sizeof(head));
	nume = 1;
	s = 1026,t = s + 1;
	maxflow = 0;
	for(int i = 1;i <= num;i++){
		add(s,i << 1,1);
		add(i << 1,s,0);
		add(i << 1 | 1,t,1);
		add(t,i << 1 | 1,0);
		}
	}
int main(){
	T = RD();
	while(T--){
		num = RD();nr = RD();
		init();
		int u,v;
		for(int i = 1;i <= nr;i++){
			u = RD();v = RD();
			add(u << 1,v << 1 | 1,1);add(v << 1 | 1,u << 1,0);
			}
		int flow = 0;
		while(bfs())while(flow = Dinic(s,INF))maxflow += flow;
		printf("%d\n",num - maxflow);
		}
	return 0;
	}
posted @ 2018-07-09 19:17  Tony_Double_Sky  阅读(248)  评论(0编辑  收藏  举报