Submission #1594474
Source Code Expand
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define fbo find_by_order
#define ook order_of_key
typedef long long ll;
typedef pair<ll,ll> ii;
typedef vector<int> vi;
typedef long double ld;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef set<int>::iterator sit;
typedef map<int,int>::iterator mit;
typedef vector<int>::iterator vit;
ll a[211][211];
int h, w;
struct Edge{
int u, v;
long long cap, cost;
Edge(int _u, int _v, long long _cap, long long _cost){
u = _u; v = _v; cap = _cap; cost = _cost;
}
};
struct MinCostFlow{
int n, s, t;
long long flow, cost;
vector<vector<int> > graph;
vector<Edge> e;
vector<long long> dist;
vector<int> parent;
MinCostFlow(int _n){
// 0-based indexing
n = _n;
graph.assign(n, vector<int> ());
}
void addedge(int u, int v, long long cap, long long cost, bool directed = true){
graph[u].push_back(e.size());
e.push_back(Edge(u, v, cap, cost));
graph[v].push_back(e.size());
e.push_back(Edge(v, u, 0, -cost));
if(!directed)
addedge(v, u, cap, cost, true);
}
pair<long long, long long> getMinCostFlow(int _s, int _t){
s = _s; t = _t;
flow = 0, cost = 0;
while(SPFA()){
flow += sendFlow(t, 1LL<<62);
}
return make_pair(flow, cost);
}
// not sure about negative cycle
bool SPFA(){
parent.assign(n, -1);
dist.assign(n, 1LL<<62); dist[s] = 0;
vector<int> queuetime(n, 0); queuetime[s] = 1;
vector<bool> inqueue(n, 0); inqueue[s] = true;
queue<int> q; q.push(s);
bool negativecycle = false;
while(!q.empty() && !negativecycle){
int u = q.front(); q.pop(); inqueue[u] = false;
for(int i = 0; i < graph[u].size(); i++){
int eIdx = graph[u][i];
int v = e[eIdx].v, w = e[eIdx].cost, cap = e[eIdx].cap;
if(dist[u] + w < dist[v] && cap > 0){
dist[v] = dist[u] + w;
parent[v] = eIdx;
if(!inqueue[v]){
q.push(v);
queuetime[v]++;
inqueue[v] = true;
if(queuetime[v] == n+2){
negativecycle = true;
break;
}
}
}
}
}
return dist[t] != (1LL<<62);
}
long long sendFlow(int v, long long curFlow){
if(parent[v] == -1)
return curFlow;
int eIdx = parent[v];
int u = e[eIdx].u, w = e[eIdx].cost;
long long f = sendFlow(u, min(curFlow, e[eIdx].cap));
cost += f*w;
e[eIdx].cap -= f;
e[eIdx^1].cap += f;
return f;
}
};
int getid(int x, int y, int type)
{
return (x*w+y)*2+type;
}
const int T = 2;
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
cin>>h>>w;
for(int i = 0; i < h; i++)
{
for(int j = 0; j < w; j++)
{
cin>>a[i][j];
}
}
MinCostFlow mcmf(h*w*2+10);
int s=h*w*2+9; int e=h*w*2+8;
mcmf.addedge(s,getid(0,0,0),T,0);
mcmf.addedge(getid(h-1,w-1,1),e,T,0);
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
if(i+1<h)
{
mcmf.addedge(getid(i,j,1),getid(i+1,j,0),T,0);
}
if(j+1<w)
{
mcmf.addedge(getid(i,j,1),getid(i,j+1,0),T,0);
}
mcmf.addedge(getid(i,j,0),getid(i,j,1),1,-a[i][j]);
mcmf.addedge(getid(i,j,0),getid(i,j,1),T-1,0);
}
}
ii tmp = mcmf.getMinCostFlow(s,e);
cout<<-tmp.se<<'\n';
}
Submission Info
Submission Time |
|
Task |
D - Souvenirs |
User |
zscoder |
Language |
C++14 (GCC 5.4.1) |
Score |
600 |
Code Size |
4053 Byte |
Status |
AC |
Exec Time |
56 ms |
Memory |
18068 KB |
Judge Result
Set Name |
Sample |
Subtask1 |
Subtask2 |
Subtask3 |
Subtask4 |
Subtask5 |
Score / Max Score |
0 / 0 |
50 / 50 |
80 / 80 |
120 / 120 |
150 / 150 |
200 / 200 |
Status |
|
|
|
|
|
|
Set Name |
Test Cases |
Sample |
sample_1.txt, sample_2.txt |
Subtask1 |
sub1_in1.txt, sub1_in2.txt, sub1_in3.txt, sub1_in4.txt |
Subtask2 |
sample_1.txt, sub1_in1.txt, sub1_in2.txt, sub1_in3.txt, sub1_in4.txt, sub2_in1.txt, sub2_in2.txt, sub2_in3.txt, sub2_in4.txt |
Subtask3 |
sample_1.txt, sample_2.txt, sub1_in1.txt, sub1_in2.txt, sub1_in3.txt, sub1_in4.txt, sub2_in1.txt, sub2_in2.txt, sub2_in3.txt, sub2_in4.txt, sub3_in1.txt, sub3_in2.txt, sub3_in3.txt, sub3_in4.txt |
Subtask4 |
sample_1.txt, sample_2.txt, sub1_in1.txt, sub1_in2.txt, sub1_in3.txt, sub1_in4.txt, sub2_in1.txt, sub2_in2.txt, sub2_in3.txt, sub2_in4.txt, sub3_in1.txt, sub3_in2.txt, sub3_in3.txt, sub3_in4.txt, sub4_in1.txt, sub4_in2.txt, sub4_in3.txt, sub4_in4.txt |
Subtask5 |
sample_1.txt, sample_2.txt, sub1_in1.txt, sub1_in2.txt, sub1_in3.txt, sub1_in4.txt, sub2_in1.txt, sub2_in2.txt, sub2_in3.txt, sub2_in4.txt, sub3_in1.txt, sub3_in2.txt, sub3_in3.txt, sub3_in4.txt, sub4_in1.txt, sub4_in2.txt, sub4_in3.txt, sub4_in4.txt, sub5_in1.txt, sub5_in2.txt, sub5_in3.txt, sub5_in4.txt |
Case Name |
Status |
Exec Time |
Memory |
sample_1.txt |
AC |
1 ms |
256 KB |
sample_2.txt |
AC |
1 ms |
256 KB |
sub1_in1.txt |
AC |
1 ms |
256 KB |
sub1_in2.txt |
AC |
1 ms |
256 KB |
sub1_in3.txt |
AC |
1 ms |
256 KB |
sub1_in4.txt |
AC |
1 ms |
256 KB |
sub2_in1.txt |
AC |
1 ms |
256 KB |
sub2_in2.txt |
AC |
1 ms |
256 KB |
sub2_in3.txt |
AC |
1 ms |
256 KB |
sub2_in4.txt |
AC |
1 ms |
256 KB |
sub3_in1.txt |
AC |
1 ms |
256 KB |
sub3_in2.txt |
AC |
1 ms |
256 KB |
sub3_in3.txt |
AC |
1 ms |
256 KB |
sub3_in4.txt |
AC |
1 ms |
256 KB |
sub4_in1.txt |
AC |
1 ms |
384 KB |
sub4_in2.txt |
AC |
2 ms |
512 KB |
sub4_in3.txt |
AC |
2 ms |
736 KB |
sub4_in4.txt |
AC |
2 ms |
736 KB |
sub5_in1.txt |
AC |
3 ms |
1436 KB |
sub5_in2.txt |
AC |
21 ms |
4504 KB |
sub5_in3.txt |
AC |
50 ms |
18068 KB |
sub5_in4.txt |
AC |
56 ms |
17300 KB |