Submission #1353150

#TimeUsernameProblemLanguageResultExecution timeMemory
1353150uiaParkovi (COCI22_parkovi)C++20
0 / 110
2 ms344 KiB
/**/ 
#pragma GCC optimize("O3") 
#include <bits/stdc++.h> 
#define file(name) freopen(name ".inp", "r", stdin); freopen(name ".out", "w", stdout); 
#define all(x) x.begin(), x.end() 
#define sortunique(x) sort(all(x)); x.erase(unique(all(x)), x.end()); 
#define forw(i,a,b) for(int (i)=(a); (i)<=(b); ++(i)) 
#define forb(i,a,b) for(int (i)=(a); (i)>=(b); --(i)) 
#define eb emplace_back 
#define fi first 
#define se second 
#define pb push_back 
using namespace std; 
using namespace std::chrono; 
static const int maxd=1003; 
typedef short bignum[maxd]; 
typedef long long ll; 
typedef long double ld; 
const int maxn=200005,mod=1000000007,maxb=320; 
namespace mathematics{ 
    long long fact[maxn],ifact[maxn]; 
    long long __gcd(long long a, long long b) { if(a<b) swap(a,b); while(a%b!=0) {long long c=a%b;a=b,b=c;} return b; } 
    inline ll __logarit(ll k, ll n){ll res=0;while(n>0){n/=k;++res;}return res;} 
    inline ll modexp(ll b, ll e, ll m) { ll res=1%m; while(e>0) { if(e&1) res=(res*b)%m; b=(b*b)%m; e>>=1; } return res; } 
    inline int maxi(int a, int b) {return (a>b?a:b);} 
    inline int mini(int a, int b) {return (a<b?a:b);} 
    inline ll maxill(ll a, ll b) {return (a>b?a:b);} 
    inline ll minill(ll a, ll b) {return (a<b?a:b);} 
    inline double maxid(double a, double b) {return (a>b?a:b);} 
    inline double minid(double a, double b) {return (a<b?a:b);} 
    inline ld maxild(ld a, ld b) {return (a>b?a:b);} 
    inline ld minild(ld a, ld b) {return (a<b?a:b);} 
    void setUpFactor() { fact[0]=1; for(int i=1; i<maxn; ++i) fact[i]=fact[i-1]*i%mod; int tc=maxn-1; ifact[tc]=modexp(fact[tc],mod-2,mod); for(int i=tc; i>=1; --i) ifact[i-1]=ifact[i]*i%mod; } 
    inline long long ncr(long long k, long long n) {return (k==n?1:fact[n]*ifact[n-k]%mod*ifact[k]%mod);} 
} 
using namespace mathematics; 
mt19937_64 generator1(steady_clock::now().time_since_epoch().count()); 
mt19937_64 generator2(high_resolution_clock::now().time_since_epoch().count()); 
inline long long rnd1(long long a, long long b) {return a+generator1()%(b-a+1);} 
inline long long rnd2(long long a, long long b) {return a+generator2()%(b-a+1);} 
auto imp_st=high_resolution_clock::now(); 
inline void start_timer() {imp_st=high_resolution_clock::now();} 
inline void get_execution_time() { auto imp_en=high_resolution_clock::now(); cerr << "Implementation Time: "<< duration_cast<milliseconds>(imp_en-imp_st).count() << " ms\n"; } 
int n,k;
vector<pair<int,long long>>adj[maxn];
namespace soup1{
    long long d[maxn];
    inline void dijkstra(vector<int>st) {
        for(int i=1; i<=n; ++i) d[i]=LLONG_MAX;
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
        for(int i:st) {
            d[i]=0;
            pq.push({0,i});
        }
        while(!pq.empty()) {
            auto[cd,u]=pq.top();pq.pop();
            if(cd>d[u]) continue;
            for(auto[v,w]:adj[u]) {
                if(d[v]>d[u]+w) {
                    d[v]=d[u]+w;
                    pq.push({d[v],v});
                }
            }
        }
    }
    void solve() {
        int fm=(1<<n);
        vector<int>ans;long long kq=LLONG_MAX;
        for(int mask=1; mask<fm; ++mask) {
            if(__builtin_popcount(mask)!=k) continue;
            vector<int>v;
            for(int i=0; i<n; ++i) {
                if((1<<i)&mask) v.pb(i+1);
            }
            dijkstra(v);
            long long tmp=0;
            for(int i=1; i<=n; ++i) tmp=max(tmp,d[i]);
            if(tmp<kq) {kq=tmp;ans=v;}
        }
        cout << kq << '\n';
        for(int i:ans) cout << i << ' ';
    }
}
namespace soup2{
    vector<pair<long long,long long>>mxd[maxn];
    long long d[maxn];
    void dijkstra(int st) {
        priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
        for(int i=1; i<=n; ++i) d[i]=LLONG_MAX;
        d[st]=0;
        pq.push({0,st});
        while(!pq.empty()) {
            auto[cd,u]=pq.top();pq.pop();
            for(auto [v,w]:adj[u]) {
                if(d[v]>d[u]+w) {d[v]=d[u]+w;pq.push({d[v],v});}
            }
        }
    }
    inline long long mxcd(vector<pair<long long,long long>>v) {sort(all(v));return (v.empty()?0:v[0].fi);}
    inline long long mxquery(vector<pair<long long,long long>>v,long long cd) {return (v.size()<1?0:(v[0].se==cd?v[1].fi:v[0].fi));}
    inline long long dfsinit(int u, int p) {
        long long tw;
        for(auto[v,w]:adj[u]) {
            if(v==p) {tw=w;continue;}
            mxd[u].pb({dfsinit(v,u),v});
        }
        long long cd=mxcd(mxd[u]);
        return cd+tw;
    }
    long long ans=LLONG_MAX,res;
    inline void dfs(int u, int p, long long t) {
        //t=max(t,mxcd(mxd[u]));
        long long tmp=max(t,mxcd(mxd[u]));
        if(tmp<ans) {
            ans=tmp;
            res=u;
        }
        for(auto[v,w]:adj[u]) {
            t=mxquery(mxd[u],v);
            dfs(v,u,t+w);
        }
    }
    void solve() {
        dijkstra(1);
        dfsinit(1,0);
        dfs(1,0,0);
        cout << ans << '\n' << res;
    }
}
int main(int argc, char** argv) { 
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); 
    file("park")
    cin >> n >> k;
    for(int i=1,a,b,w; i<n; ++i) {cin >> a >> b >> w;adj[a].pb({b,w});adj[b].pb({a,w});}
    if(n<=23) soup1::solve();
    // cout << '\n';
    // soup2::solve();
    return 0; 

} 
/**/
/*
9 3
1 2 5
1 3 1
3 4 10
3 5 9
5 6 8
2 7 1
2 8 2
8 9 7

5 2
1 2 3
2 3 7
3 4 3
4 5 3

7 4
1 3 1
1 4 1
2 3 1
5 3 1
4 7 1
4 6 1
*/

Compilation message (stderr)

Main.cpp: In function 'int main(int, char**)':
Main.cpp:4:27: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    4 | #define file(name) freopen(name ".inp", "r", stdin); freopen(name ".out", "w", stdout);
      |                    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:132:5: note: in expansion of macro 'file'
  132 |     file("park")
      |     ^~~~
Main.cpp:4:61: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    4 | #define file(name) freopen(name ".inp", "r", stdin); freopen(name ".out", "w", stdout);
      |                                                      ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:132:5: note: in expansion of macro 'file'
  132 |     file("park")
      |     ^~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...