結果
| 問題 |
No.2320 Game World for PvP
|
| コンテスト | |
| ユーザー |
amentorimaru
|
| 提出日時 | 2023-02-16 23:27:34 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,656 bytes |
| コンパイル時間 | 798 ms |
| コンパイル使用メモリ | 85,160 KB |
| 最終ジャッジ日時 | 2025-02-10 16:03:26 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 4 |
| other | WA * 30 |
コンパイルメッセージ
main.cpp: In member function ‘void MaxFlow::addEdge(ll, ll, ll, ll)’:
main.cpp:19:44: warning: narrowing conversion of ‘(&((MaxFlow*)this)->MaxFlow::edges.std::vector<std::vector<MaxFlow::edge> >::operator[](((std::vector<std::vector<MaxFlow::edge> >::size_type)to)))->std::vector<MaxFlow::edge>::size()’ from ‘std::vector<MaxFlow::edge>::size_type’ {aka ‘long unsigned int’} to ‘ll’ {aka ‘long long int’} [-Wnarrowing]
19 | edge eF = { to,cap - rev,edges[to].size() };
| ~~~~~~~~~~~~~~^~
main.cpp:21:45: warning: narrowing conversion of ‘((&((MaxFlow*)this)->MaxFlow::edges.std::vector<std::vector<MaxFlow::edge> >::operator[](((std::vector<std::vector<MaxFlow::edge> >::size_type)from)))->std::vector<MaxFlow::edge>::size() - 1)’ from ‘std::vector<MaxFlow::edge>::size_type’ {aka ‘long unsigned int’} to ‘ll’ {aka ‘long long int’} [-Wnarrowing]
21 | edge eT = { from,rev,edges[from].size() - 1 };
| ~~~~~~~~~~~~~~~~~~~^~~
ソースコード
#include<iostream>
#include<vector>
using namespace std;
using ll = long long;
#define REP(i, n) for(ll i=0; i<(n);i++)
class MaxFlow {
public:
struct edge {
ll to, cap, rev;
};
MaxFlow(ll n) {
point = n;
edges.resize(n);
used.resize(n);
}
void addEdge(ll from, ll to, ll cap, ll rev = 0) {
edge eF = { to,cap - rev,edges[to].size() };
edges[from].push_back(eF);
edge eT = { from,rev,edges[from].size() - 1 };
edges[to].push_back(eT);
}
ll dfs(ll v, ll t, ll f) {
if (v == t)return f;
used[v] = true;
for (ll i = 0; i < edges[v].size(); i++) {
edge& e = edges[v][i];
if (!used[e.to] && e.cap > 0) {
ll d = dfs(e.to, t, min(f, e.cap));
if (d > 0) {
e.cap -= d;
edges[e.to][e.rev].cap += d;
return d;
}
}
}
return 0;
}
ll getMaxFlow(ll s, ll g) {
ll flow = 0;
for (;;) {
used.assign(point, 0);
ll f = dfs(s, g, 3e18);
if (f == 0)break;
flow += f;
}
return flow;
}
ll point;
vector<vector<edge>> edges;
vector<bool> used;
};
int main() {
ll n, s, t;
cin >> n >> s >> t;
vector<ll> a(s), b(t);
vector c(n, vector<ll>(n));
REP(i, s)
cin >> a[i];
REP(i, t)
cin >> b[i];
REP(i, n)
REP(j, n)
cin >> c[i][j];
MaxFlow mf(n + 2);
ll start = n;
ll goal = n + 1;
ll in = 1e16;
REP(i, s)
mf.addEdge(start, a[i] - 1, in);
REP(i, t)
mf.addEdge(b[i] - 1, goal, in);
REP(i, n) {
REP(j, n) {
if (i == j)
continue;
mf.addEdge(i, j, c[i][j]);
}
}
cout << mf.getMaxFlow(start, goal);
return 0;
}
amentorimaru