QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#752356 | #8136. Rebellious Edge | ucup-team3646 | WA | 58ms | 3812kb | C++20 | 3.1kb | 2024-11-16 01:06:12 | 2024-11-16 01:06:12 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, n) for (ll i = 0; i < n; i++)
#define rep2(i, l, r) for (ll i = l; i < r; i++)
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<ll>;
/* ---- */
#define all(A) A.begin(), A.end()
#define elif else if
using pii = pair<ll, ll>;
bool chmin(auto &a, const auto &b) { return a > b ? a = b, 1 : 0; }
bool chmax(auto &a, const auto &b) { return a < b ? a = b, 1 : 0; }
struct IOSetup {
IOSetup() {
cin.tie(0);
ios::sync_with_stdio(0);
}
} iosetup;
template <class T>
void print(vector<T> a) {
for (auto x : a) cerr << x << ' ';
cerr << endl;
}
void print(auto x) { cerr << x << endl; }
template <class Head, class... Tail>
void print(Head &&head, Tail &&...tail) {
cerr << head << ' ';
print(forward<Tail>(tail)...);
}
ll inf=1LL<<61;
ll calc1(int n,vector<vector<pair<int,ll>>>&edge){
vector<vector<pair<int,ll>>>redge(n);
rep(v,n){
for(auto [u,w]:edge[v]){
redge[u].push_back({v,w});
}
}
ll sm=0;
rep2(i,1,n){
if(redge[i].size()==0){
return inf;
}
ll mn=inf;
for(auto [v,w]:redge[i])mn=min(mn,w);
sm+=mn;
}
return sm;
}
ll calc2(int n,vector<vector<pair<int,ll>>>&edge,int u0,int v0,ll w0){
if(v0==0)return inf;
// とりあえず v0 以外の頂点について最小コストの親との間に辺を貼る
// もしループができるなら,そのループ内の頂点の親を変えてみる
vector<vector<pair<int,ll>>>redge(n);
rep(v,n){
for(auto [u,w]:edge[v]){
redge[u].push_back({v,w});
}
}
vi par(n,-1);
ll sm=0;
rep2(i,1,n){
if(i==v0){
par[i]=u0;
sm+=w0;
continue;
}
if(redge[i].size()==0){
return inf;
}
ll mn=inf;
int p=-1;
for(auto [v,w]:redge[i]){
if(w<mn){
mn=w;
p=v;
}
}
sm+=mn;
par[i]=p;
}
// loop かチェック
{
int now=u0;
while(true){
if(now==0)return sm;
if(now==v0)break;
now=par[now];
}
}
vi inloop(n,0);
vvi child(n);
rep2(i,1,n)child[par[i]].push_back(i);
vi todo={v0};
inloop[v0]=1;
while(!todo.empty()){
int v=todo.back();
todo.pop_back();
for(auto u:child[v]){
if(inloop[u]==0){
inloop[u]=1;
todo.push_back(u);
}
}
}
ll ans=inf;
{
int now=u0;
while(now!=v0){
ll prev=inf,nw=inf;
for(auto [u,w]:redge[now]){
if(u==par[now]){
prev=min(prev,w);
}
elif(inloop[u]==0){
nw=min(nw,w);
}
}
ans=min(ans,sm-prev+nw);
now=par[now];
}
}
return ans;
}
void solve(){
int n,m;
cin>>n>>m;
int u0,v0,w0;
vector<vector<pair<int,ll>>>edge(n);
rep(i,m){
int u,v,w;
cin>>u>>v>>w;
u--;v--;
if(u<v)edge[u].push_back({v,w});
else{
u0=u;
v0=v;
w0=w;
}
}
ll ans=min(calc1(n,edge),calc2(n,edge,u0,v0,w0));
cout<<ans<<'\n';
}
int main(){
int T;
cin>>T;
rep(i,T)solve();
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3812kb
input:
3 5 6 1 2 4 1 3 2 2 3 0 3 4 1 4 5 1 5 2 1 4 4 1 2 4 1 3 6 1 4 8 4 2 1000000 3 3 1 2 100 2 1 10 2 3 1000
output:
5 18 1100
result:
ok 3 number(s): "5 18 1100"
Test #2:
score: 0
Accepted
time: 45ms
memory: 3576kb
input:
50000 4 5 2 4 998973548 2 3 501271695 4 1 778395982 1 4 32454891 1 2 757288934 4 5 1 4 720856669 2 3 665098951 3 4 407461517 2 1 866914401 1 2 457859826 4 5 1 2 75288664 1 4 624893594 3 2 458973866 2 4 769074655 2 3 834773751 4 5 2 3 237060634 2 4 297307882 3 4 200383586 1 2 42856502 3 1 16574713 4 ...
output:
1291015520 1530420294 1534956009 480300722 1366795927 1541095843 2493849488 858095911 1034153425 793861088 605832428 1051598350 612891589 1265994009 517769091 1678219738 1556463491 93634961 960978736 984886788 1696503797 1002892611 1969660290 1431417780 1515267731 977157479 1937478556 654475526 1401...
result:
ok 50000 numbers
Test #3:
score: -100
Wrong Answer
time: 58ms
memory: 3596kb
input:
50000 4 6 1 3 754771977 2 3 517886121 1 4 392356144 1 2 702785740 3 4 888230940 2 1 829304957 4 6 2 4 255940037 1 2 380616616 1 4 819140865 3 4 36965607 1 3 496378345 4 3 652252309 4 6 2 4 179216787 4 2 401136502 1 2 715271531 1 3 859345710 3 4 24470489 1 4 148650889 4 6 3 2 20348069 1 2 152861663 1...
output:
1613028005 913960568 1284952701 1294564551 199037829 1236121455 983447828 1161647829 1289612543 2444304029 431872921 1272140390 949528400 2328941976 696541797 363553357 999320657 2221495861 879052116 1287531701 912524980 1072419431 1187727045 1571845059 1184110956 1136184594 430092563 1132894799 962...
result:
wrong answer 313th numbers differ - expected: '1326090611', found: '1821468187'