Submission #5548461


Source Code Expand

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <cmath>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <complex>
#include <unordered_map>
#include <unordered_set>
#include <random>
#include <cassert>
#include <fstream>
#define popcount __builtin_popcount
using namespace std;
typedef long long int ll;
typedef pair<int, int> P;
const ll INF=1e9;
struct edge{
    int to, cap, rev; ll cost;
};
 
int V;
vector<edge> g[20002];
ll h[20002];
ll dist[20002];
int prevv[20002], preve[20002];
 
void add_edge(int from, int to, int cap, ll cost){
    edge e;
    e.to=to, e.cap=cap, e.cost=cost, e.rev=g[to].size();
    g[from].push_back(e);
    e.to=from, e.cap=0, e.cost=-cost, e.rev=g[from].size()-1;
    g[to].push_back(e);
}
   
ll min_cost_flow(int s, int t, int f){
    ll res=0;
    fill(h, h+V, 0);
    while(f>0){
        priority_queue<P, vector<P>, greater<P>> que;
        fill(dist, dist+V, INF);
        dist[s]=0;
        que.push(P(0, s));
        while(!que.empty()){
            P p=que.top(); que.pop();
            int v=p.second;
            if(dist[v]<p.first) continue;
            for(int i=0; i<g[v].size(); i++){
                edge &e=g[v][i];
                if(e.cap>0 && dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]){
                    dist[e.to]=dist[v]+e.cost+h[v]-h[e.to];
                    prevv[e.to]=v;
                    preve[e.to]=i;
                    que.push(P(dist[e.to], e.to));
                }
            }
        }
        for(int v=0; v<V; v++) h[v]+=dist[v];
        if(dist[t]==INF) return -1;
        int d=f;
        for(int v=t; v!=s; v=prevv[v]){
            d=min(d, g[prevv[v]][preve[v]].cap);
        }
        f-=d;
        res+=d*h[t];
        for(int v=t; v!=s; v=prevv[v]){
            edge &e=g[prevv[v]][preve[v]];
            e.cap-=d;
            g[v][e.rev].cap+=d;
        }
    }
    return res;
}
int main()
{
    int n; cin>>n;
    V=2*n+4;
    int s=V-1, t=V-2, S=V-3, T=V-4, F=2;
    add_edge(S, s, 2, 0);
    add_edge(t, T, 2, 0);
    int ans=0;
    for(int i=0; i<n; i++){
        add_edge(s, i, INF, 0);
        add_edge(i+n, t, INF, 0);
        add_edge(i, i+n, INF, 0);
        add_edge(i+n, i, 1, 1);
        add_edge(S, i+n, 1, 0);
        add_edge(i, T, 1, 0);
        ans--; F++;
        for(int j=0; j<n; j++){
            int p; cin>>p; if(p) add_edge(i+n, j, INF, 0);
        }
    }
    ans+=min_cost_flow(S, T, F);
    cout<<-ans<<endl;
    return 0;
}

Submission Info

Submission Time
Task R - グラフ
User chocorusk
Language C++14 (GCC 5.4.1)
Score 0
Code Size 2656 Byte
Status WA
Exec Time 45 ms
Memory 1152 KB

Judge Result

Set Name All
Score / Max Score 0 / 7
Status
AC × 20
WA × 2
Set Name Test Cases
All 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 90, 91
Case Name Status Exec Time Memory
00 AC 39 ms 896 KB
01 AC 41 ms 896 KB
02 AC 42 ms 896 KB
03 WA 42 ms 896 KB
04 AC 42 ms 896 KB
05 WA 42 ms 896 KB
06 AC 41 ms 896 KB
07 AC 41 ms 896 KB
08 AC 40 ms 896 KB
09 AC 41 ms 896 KB
10 AC 33 ms 896 KB
11 AC 42 ms 896 KB
12 AC 42 ms 896 KB
13 AC 42 ms 1024 KB
14 AC 42 ms 1024 KB
15 AC 43 ms 1024 KB
16 AC 43 ms 1152 KB
17 AC 43 ms 1152 KB
18 AC 44 ms 1152 KB
19 AC 45 ms 1152 KB
90 AC 1 ms 768 KB
91 AC 1 ms 768 KB