Submission #882818

#TimeUsernameProblemLanguageResultExecution timeMemory
882818ThylOneEvacuation plan (IZhO18_plan)C++14
41 / 100
4037 ms59428 KiB
//#################### //IZHO_2018_Plan //#################### #include<bits/stdc++.h> #define int long long using namespace std; const int INF=1e18; const int maxiNode = 2*100*1000; vector<pair<int,int>> links[maxiNode]; struct UnionFind{ vector<int> chef; vector<vector<int>> token_id; UnionFind(int _size){ chef.resize(_size); token_id.resize(_size); for(int i=0;i<_size;i++){ chef[i]=i; } } int find(int a){ if(chef[a]==a)return a; else return chef[a]=find(chef[a]); } vector<int> fusion(int a,int b){ int ra = find(a); int rb = find(b); if(ra!=rb){ if(token_id[rb].size()<token_id[ra].size())swap(ra,rb); chef[ra]=rb; vector<int> fusion_id = token_id[rb]; fusion_id.insert(fusion_id.end(),token_id[ra].begin(),token_id[ra].end()); token_id[ra].clear(); token_id[rb].clear(); sort(fusion_id.begin(),fusion_id.end()); vector<int> re; for(int i =0;i<fusion_id.size();i++){ if(i+1<fusion_id.size() && fusion_id[i]==fusion_id[i+1]){ re.push_back(fusion_id[i]); i++; }else{ token_id[rb].push_back(fusion_id[i]); } } return re; }else{ return {}; } } void debug_token_id(){ cout<<"××××××××××××××××××××××××××××××××××××"<<endl; for(int i=0;i<token_id.size();i++){ for(int v:token_id[i]){ cout<<v<<' '; } cout<<endl; } cout<<"××××××××××××××××××××××××××××××××××××"<<endl; } void addReq(int a,int b,int id){ token_id[a].push_back(id); token_id[b].push_back(id); } }; int minimal_distance[maxiNode]; bool comp(pair<int,int> &a,pair<int,int> &b){ int ra = min(minimal_distance[a.first],minimal_distance[a.second]); int rb = min(minimal_distance[b.first],minimal_distance[b.second]); return ra<rb; } signed main(){ ios::sync_with_stdio(false); cin.tie(0); int n,m;cin>>n>>m; vector<pair<int,int>> edges; for(int i = 0;i<m;i++){ int a,b,w; cin>>a>>b>>w; a--;b--; links[a].push_back({b,w}); links[b].push_back({a,w}); edges.push_back({a,b}); } int k;cin>>k; vector<int> infected(k); for(int i=0;i<k;i++){ cin>>infected[i]; infected[i]--; } //Djikstra multi-source priority_queue<pair<int,int>> PQ; for(int i=0;i<k;i++){ PQ.push({-0,infected[i]}); } fill(minimal_distance,minimal_distance+n,-1); while(!PQ.empty()){ pair<int,int> act = PQ.top(); PQ.pop(); if(minimal_distance[act.second]!=-1){ continue; }else{ minimal_distance[act.second] = act.first * -1; for(auto p:links[act.second]){ PQ.push({(minimal_distance[act.second]+p.second)*-1,p.first}); } } } UnionFind UF(n); sort(edges.rbegin(),edges.rend(),comp); int q;cin>>q; int ans[q]; for(int i=0;i<q;i++){ int a,b;cin>>a>>b;a--;b--; UF.addReq(a,b,i); } for(int i=0;i<m;i++){ pair<int,int> &act = edges[i]; vector<int> re = UF.fusion(act.first,act.second); int W = min(minimal_distance[act.first],minimal_distance[act.second]); for(int i:re){ ans[i] = W; } } for(int i=0;i<q;i++){ cout<<ans[i]<<'\n'; } return 0; };

Compilation message (stderr)

plan.cpp: In member function 'std::vector<long long int> UnionFind::fusion(long long int, long long int)':
plan.cpp:38:27: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   38 |             for(int i =0;i<fusion_id.size();i++){
      |                          ~^~~~~~~~~~~~~~~~~
plan.cpp:39:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |                 if(i+1<fusion_id.size() && fusion_id[i]==fusion_id[i+1]){
      |                    ~~~^~~~~~~~~~~~~~~~~
plan.cpp: In member function 'void UnionFind::debug_token_id()':
plan.cpp:53:22: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::vector<long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |         for(int i=0;i<token_id.size();i++){
      |                     ~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...