Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include<map>
  4. #include <queue>
  5. #include<vector>
  6. using namespace std;
  7. long n,m,s1,t1,l1,s2,t2,l2,p[100001]; vector <int> g[100001];
  8. long d[5][100001];queue <int> q; bool used[1000001];
  9. void bfs(int v,int ind){
  10.      q.push(v); p[v]=-1;used[v]=1;
  11.                      while(!q.empty()){
  12.                                 int w=q.front();
  13.                                 q.pop();
  14.                                 for (int k=0;k<g[w].size();++k){
  15.                                     int t=g[w][k];
  16.                                     if (!used[t]){
  17.                                               used[t]=true;
  18.                                               q.push(t);
  19.                                               d[ind][t]=d[ind][w]+1;
  20.                                               p[t]=w;    
  21.                                                   }
  22.                                 }  
  23.                                   }
  24.      }
  25.      vector <int> a,b;
  26. int main(){
  27. //freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);
  28.  cin>>n>>m;
  29.  for (int k=1;k<=m;++k) {
  30.      long a,b;
  31.      cin>>a>>b;
  32.      g[a].push_back(b);
  33.      g[b].push_back(a);
  34.  }
  35.  cin>>s1>>t1>>l1>>s2>>t2>>l2;
  36.  bfs(s1,0);
  37.  long k=t1;
  38.                                 while (k>=1){
  39.                                     a.push_back(k);
  40.                                      k=p[k];
  41.                                      }        
  42.  for (int k=0;k<=n;++k) used[k]=0;
  43.  bfs(s2,1);
  44.  k=t2;
  45.     while (k>=1){
  46.         //  cout<<k<<endl;
  47.                                     b.push_back(k);
  48.                                      k=p[k];
  49.                                      }    
  50.    long z=d[0][t1]+d[1][t2];
  51.    if (d[0][t1]>l1 || d[1][t2]>l2) z=1000000;
  52.    if ((d[0][t1]==0  && s1!=t1)|| (s2!=t2&&d[1][t2]==0)) {
  53.                    cout<<-1;
  54.                    return 0;                
  55.                      }
  56.   // cout<<z;return 0;
  57.     long p1=d[1][s1]+d[0][t1];
  58.     if (d[0][t1]>l1) p1+=10000000;
  59.     long minx=1000000,j=-1;
  60.      for (int k=0;k<=n;++k) used[k]=0;
  61.     bfs(t2,2);
  62.     for (int k=0;k<a.size();++k) {
  63.          if (minx>d[2][a[k]]) j=a[k];
  64.         minx=min(minx,d[2][a[k]]);}
  65.         if (d[1][s1]+d[0][j]+d[2][j]<=l2 && j!=-1)
  66.        z=min(z,p1+minx);
  67.         p1=d[0][s2]+d[1][t2];
  68.         if (d[1][t2]>l2) p1+=100000000;
  69.          for (int k=0;k<=n;++k) used[k]=0;
  70.         bfs(t1,3);
  71.       minx=1000000,j=-1;
  72.       for (int k=0;k<b.size();++k) {
  73.          if (minx>d[3][b[k]]) j=b[k];
  74.         minx=min(minx,d[3][b[k]]);}
  75.       //  cout<<d[3][j];return 0;
  76.         if (d[0][s2]+d[1][j]+d[3][j]<=l1 && j!=-1)
  77.         z=min(z,p1+minx);
  78.         if (m>=z) cout<<m-z; else cout<<-1;
  79.   return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement