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 |
|
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 |