QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#287815 | #3855. Regional development | LaStataleBlue# | WA | 0ms | 3400kb | C++23 | 2.5kb | 2023-12-21 00:32:43 | 2023-12-21 00:32:43 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
using pi = pair<int,int>;
#define sz(x) int((x).size())
template<class F> struct Dinic {
struct Edge { int to, rev; F cap; };
int N; vector<vector<Edge>> adj;
void init(int _N) { N = _N; adj.resize(N); } //0-based
pi ae(int a, int b, F cap, F rcap = 0) {
assert(min(cap,rcap) >= 0); // saved me > once
adj[a].push_back({b,sz(adj[b]),cap});
adj[b].push_back({a,sz(adj[a])-1,rcap});
return {a,sz(adj[a])-1};
}
F edgeFlow(pi loc) { // get flow along original edge
const Edge& e = adj.at(loc.first).at(loc.second);
return adj.at(e.to).at(e.rev).cap;
}
vector<int> lev, ptr;
bool bfs(int s,int t){//level=shortest dist from source
lev = ptr = vector<int>(N);
lev[s] = 1; queue<int> q({s});
while (sz(q)) { int u = q.front(); q.pop();
for(auto& e: adj[u]) if (e.cap && !lev[e.to]) {
q.push(e.to), lev[e.to] = lev[u]+1;
if (e.to == t) return 1;
}
}
return 0;
}
F dfs(int v, int t, F flo) {
if (v == t) return flo;
for (int& i = ptr[v]; i < sz(adj[v]); i++) {
Edge& e = adj[v][i];
if (lev[e.to]!=lev[v]+1||!e.cap) continue;
if (F df = dfs(e.to,t,min(flo,e.cap))) {
e.cap -= df; adj[e.to][e.rev].cap += df;
return df; } // saturated $\geq1$ one edge
}
return 0;
}
F maxFlow(int s, int t) {
F tot = 0; while (bfs(s,t)) while (F df =
dfs(s,t,numeric_limits<F>::max())) tot += df;
return tot;
}
};
#define int long long
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,r,m;
cin>>n>>r>>m;
Dinic<int> ds;
int source = n, sink = n+1;
ds.init(n+2);
vector<int> a(r),b(r),c(r);
vector<int> sum(n,0);
vector mat(n,vector(n,0));
for(int i=0;i<r;i++){
cin>>a[i]>>b[i]>>c[i];
a[i]--;
b[i]--;
sum[a[i]]-=c[i];
sum[b[i]]+=c[i];
mat[a[i]][b[i]]=m-1-c[i];
mat[b[i]][a[i]]=min(c[i]-1,m-1+c[i]);
ds.ae(a[i],b[i],m-1-c[i]);
ds.ae(b[i],a[i],min(c[i]-1,m-1+c[i]));
}
int tot=0,tot2=0;
for(int i=0;i<n;i++){
if(sum[i]<0){
ds.ae(i,sink,-sum[i]);
tot2+=-sum[i];
}
else{
tot+=sum[i];
ds.ae(source,i,sum[i]);
}
}
if(tot!=tot2 || ds.maxFlow(source,sink)!=tot){
cout<<"IMPOSSIBLE\n";
}else{
for(int i=0;i<n;i++){
for(auto j : ds.adj[i]){
if(j.to!=source && j.to!=sink){
mat[i][j.to]-=j.cap;
//cout<<i<<" "<<j.to<<" "<<j.cap<<"\n";
}
}
}
for(int i=0;i<r;i++){
int x = c[i]+mat[a[i]][b[i]];
assert(x!=0);
cout<<c[i]+mat[a[i]][b[i]]<<"\n";
}
}
}
详细
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3400kb
input:
10 23 3 2 10 1 2 6 1 6 9 1 7 9 1 6 7 1 3 6 1 1 3 1 1 6 2 6 10 1 2 9 1 4 9 2 4 7 2 3 10 2 3 9 1 6 8 1 7 8 2 3 5 1 5 9 1 8 9 2 3 8 2 1 5 2 1 4 1 5 10 2
output:
IMPOSSIBLE
result:
wrong output format Expected integer, but "IMPOSSIBLE" found