Advertisement
at3107

travelling_is_fun && shortest path revisited

Nov 6th, 2020 (edited)
1,809
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N=2e5+6;
  4. int n,parent[N],siz[N];
  5. int find(int v)
  6. {
  7.     if(v==parent[v]) return v;
  8.     return parent[v]=find(parent[v]);
  9. }
  10. void uni(int a,int b)
  11. {
  12.     a=find(a);
  13.     b=find(b);
  14.     if(a==b) return ;
  15.     if(siz[a]<siz[b]) swap(a,b);
  16.     siz[a]+=siz[b];
  17.     parent[b]=a;
  18.     return ;
  19. }
  20. int main()
  21. {
  22.     cin>>n;
  23.     for(int i=1;i<=n;i++) parent[i]=i,siz[i]=1;
  24.     int thres,q;
  25.     cin>>thres>>q;
  26.     int ori[q],des[q];
  27.     for(int i=0;i<q;i++) cin>>ori[i];
  28.     cin>>q;
  29.     for(int i=0;i<q;i++) cin>>des[i];
  30.     for(int i=thres+1;i<=n;i++)
  31.     {
  32.         for(int j=i;j<=n;j+=i) uni(i,j);
  33.     }
  34.     for(int i=0;i<q;i++)
  35.     {
  36.         if(find(ori[i])==find(des[i])) cout<<1<<endl;
  37.         else cout<<0<<endl;
  38.     }
  39. }
  40.  
  41.  
  42.  
  43.  
  44. #include<bits/stdc++.h>
  45. using namespace std;
  46. #define F first
  47. #define S second
  48. #define ll long long
  49.  
  50. int main()
  51. {
  52.     ll n,m,k,hell=1e12;
  53.     cin>>n>>m>>k;
  54.     vector<pair<ll,ll> > adj[n+1];
  55.     vector<vector<bool> >vis(n+1,vector<bool>(k+1,0));
  56.     vector<vector<ll> >dis(n+1,vector<ll>(k+1,hell));
  57.     for(int i=0;i<m;i++)
  58.     {
  59.         ll x,y,z;
  60.         cin>>x>>y>>z;
  61.         adj[x].push_back({y,z});
  62.         adj[y].push_back({x,z});
  63.     }
  64.     for(int i=0;i<=k;i++) dis[1][i]=0;
  65.     priority_queue<tuple<ll,ll,ll> >pq;
  66.     pq.push({0,1,0});
  67.     while(!pq.empty())
  68.     {
  69.         ll x,y,z;
  70.         tie(x,y,z)=pq.top();
  71.         pq.pop();
  72.         if(vis[y][z]==1) continue;
  73.         vis[y][z]=1;
  74.         for(auto i:adj[y])
  75.         {  
  76.             if(dis[i.F][z]>dis[y][z]+i.S)
  77.             {
  78.                 dis[i.F][z]=dis[y][z]+i.S;
  79.                 pq.push({-dis[i.F][z],i.F,z});
  80.             }
  81.             if(z<k)
  82.             {
  83.                 if(dis[i.F][z+1]>dis[y][z])
  84.                 {
  85.                     dis[i.F][z+1]=dis[y][z];
  86.                     pq.push({-dis[i.F][z+1],i.F,z+1});
  87.                 }
  88.             }
  89.         }
  90.     }
  91.     for(int i=1;i<=n;i++)
  92.     {
  93.         ll ans=hell;
  94.         for(int j=0;j<=k;j++) ans=min(ans,dis[i][j]);
  95.         cout<<ans<<' ';
  96.     }
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement