求hack UDebug 全过了
查看原帖
求hack UDebug 全过了
590022
anhengyu楼主2022/8/3 21:44
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <unordered_map>

using namespace std;

const int N = 510, M = 1e5+10, INF = 0x3f3f3f3f;

typedef pair<string,string> PSS;
typedef long long LL;
struct Edge{
    int v,c,ne;
} e[M];

int h[N],idx = 1,cur[N],d[N];
int n,m,k,g[400][400];
int S,T;
unordered_map<string,int> id;
vector<string> dv;
vector<string> dz;

void add(int a,int b,int c){
    e[++idx] = {b,c,h[a]};
    h[a] = idx;
}

bool bfs(){
    memset(d,0,sizeof d);
    d[S] = 1;
    queue<int> q;q.push(S);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        for(int i = h[u]; i != -1; i = e[i].ne){
            int v = e[i].v;
            if(!d[v] && e[i].c){
                d[v] = d[u] + 1;
                q.push(v);
                if(v == T)return true;
            }
        }
    }
    return false;
}

LL dfs(int u,LL mf){
    if(u == T)return mf;
    LL sum = 0;
    for(int i = cur[u]; i != -1; i = e[i].ne){
        cur[u] = i;
        int v = e[i].v;
        if(d[v] == d[u] + 1 && e[i].c){
            LL f = dfs(v,min(mf,(LL)e[i].c));
            e[i].c -= f;
            e[i^1].c += f;
            sum += f;
            mf -= f;
            if(!mf)break;
        }
    }
    if(sum == 0)d[u] = 0;
    return sum;
}

LL dinic(){
    LL flow = 0;
    while(bfs()){
        memcpy(cur,h,sizeof h);
        flow += dfs(S,INF);
    }
    return flow;
}
void Floyd(int n){
    for(int k = 1; k <= n; ++k){
        for(int i = 1; i <= n; ++i){
            for(int j = 1; j <= n; ++j){
                if(i == j)g[i][j] = 1;
                g[i][j] = (g[i][j] || (g[i][k] && g[k][j]));
            }
        }
    }
}
int main()
{
    //freopen("out.txt","w",stdout);
    int cases;
    cin >> cases;
    while(cases --) {
        dz.clear();
        dv.clear();
        id.clear();
        idx = 1;
        memset(h,-1,sizeof h);
        memset(g,0,sizeof g);
        int cnt = 0;
        cin >> n;
        while(n -- ) {
            string z;
            cin >> z;
            dz.push_back(z);
            if(!id.count(z))id[z] = ++cnt;
        }
        cin >> m;
        for(int i = 0; i < m ;++i){
            string nm,z;
            cin >> nm >> z;
            dv.push_back(z);
            if(!id.count(z))id[z] = ++cnt;
        }
        cin >>k;
        while(k -- ) {
            string z,t;
            cin >> z >> t;
            if(!id.count(z))id[z] = ++cnt;
            if(!id.count(t))id[t] = ++cnt;
            g[id[z]][id[t]] = 1;
        }

        Floyd(cnt);
        S = 0,T = cnt + 1;
        for(int i = 0; i < dz.size(); ++i)add(id[dz[i]],T,1),add(T,id[dz[i]],0);
        for(int i = 1; i <= dv.size(); ++i){
            string t = dv[i - 1];
            int a = id[t];
            add(S,T + i,1),add(T + i,S,0);
            for(int j = 1; j <= cnt; ++j){
                if(g[a][j])add(T + i,j,INF),add(j,T + i,0);
            }
        }
        LL t = dinic();
        printf("%lld\n",m - t);
        if(cases)puts("");
    }

    return 0;
}
2022/8/3 21:44
加载中...