求助,90pts,最后一点WA
查看原帖
求助,90pts,最后一点WA
505959
YangJinxi_7_22楼主2023/9/5 23:29
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
const int N = 1e3+5;
const int M = 2e3+5;
int n , m , p1[N] , p2[N] , in[N];
int head[N] , tot = 0;
struct edge{
    int to , nxt;
}e[M*2];
bool color[N] , vis[N];
int match[N];

void add( int u , int v ){
    e[++tot].to = v;
    e[tot].nxt = head[u];
    head[u] = tot;
}

void dfs( int u ){
    if( vis[u] ) return;
    vis[u] = 1;
    for( int i = head[u] ; i ; i = e[i].nxt ){
        int v = e[i].to;
        color[v] = !color[u];
        dfs( v );
    }
}

int found( int u ){
    if( vis[u] ) return 0;
    vis[u] = 1;
    for( int i = head[u] ; i ; i = e[i].nxt ){
        int v = e[i].to;
        if( match[v] == -1 || found( match[v] ) ){
            match[v] = u;
            return 1;
        }
    }
    return 0;
}

int main( ) {
    cin >> n >> m;
    for( int i = 1 ; i <= m ; i++ ){
        cin >> p1[i] >> p2[i];
        p1[i]++;
        p2[i]++;
        in[p1[i]] = in[p2[i]] = 1;
        add( p1[i] , p2[i] );
        add( p2[i] , p1[i] );
    }
    for( int i = 1 ; i <= n ; i++ ){
        if( !vis[i] && in[i] ) dfs( i );
    }
    memset( e , 0 , sizeof( e ) );
    memset( head , 0 , sizeof( head ) );
    tot = 0;
    for( int i = 1 ; i <= m ; i++ ){
        if( color[p1[i]] ){
            swap( p1[i] , p2[i] );
        }
        add( p1[i] , p2[i] );
    }
    memset( match , -1 , sizeof( match ) );
    int ans = 0;
    for( int i = 1 ; i <= n ; i++ ){
        if( !color[i] && in[i] ){
            memset( vis , 0 , sizeof( vis ) );
            ans += found( i );
        }
    }
    cout << n-ans <<endl;
    return 0;
}

2023/9/5 23:29
加载中...