记录编号 269519 评测结果 AAWWWWAWWWW
题目名称 [网络流24题] 最小路径覆盖问题 最终得分 27
用户昵称 Gravatar‎MistyEye 是否通过 未通过
代码语言 C++ 运行时间 0.008 s
提交时间 2016-06-13 17:48:08 内存使用 0.68 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int read(){
	int x=0, f=1; char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
const int maxn = 6000;

struct Edge{
    int next, to;
}e[24001];
int head[maxn<<1], tot;
void Add(int x,int y)
{
	e[++tot].to=y;
	e[tot].next=head[x];
	head[x]=tot;
}
int match[maxn<<1], vis[maxn<<1], T;
int last[maxn<<1];

int N, M;
bool target(int x){
    for(int i=head[x]; i; i=e[i].next){
        int to = e[i].to;
        if(!vis[to]){
            vis[to] = 1;
            if(!match[to] || target(match[to])){
                match[to] = x;
                last[x] = to;
                return true;
            }
        }
    }
    return false;
}
int main(){
	freopen("path3.in","r",stdin);
	freopen("path3.out","w",stdout);
	N = read(), M = read();
    for(int i=1; i<=M; ++i){
        int a = read(), b = read();
        Add(a, b);
    }
    int ans = 0;
    for(int i=1; i<=N; ++i){
        memset(vis, 0, sizeof(vis));
        if(!target(i)) ans++;
    }
    for(int i=1; i<=N; ++i)
        if(!match[i]){
            int x = i;
            do{
                printf("%d ", x);
                x = last[x];
            }while(x);
            puts("");
        }
    printf("%d", ans);
    fclose(stdin); fclose(stdout);
	return 0;
}