QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#752356#8136. Rebellious Edgeucup-team3646WA 58ms3812kbC++203.1kb2024-11-16 01:06:122024-11-16 01:06:12

Judging History

你现在查看的是最新测评结果

  • [2024-11-16 01:06:12]
  • 评测
  • 测评结果:WA
  • 用时:58ms
  • 内存:3812kb
  • [2024-11-16 01:06:12]
  • 提交

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'