Mephistopheles_

ТПР

Mar 26th, 2022 (edited)
1,125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #define INF int(1e9)
  2. vector<vector<double>>g(10,vector<double>(10,-1));// матрица смежности
  3. vector<int>us(10,-1); // сохраняем уровень вершин
  4. void dfs(int x,int k=1){
  5.     us[x]=max(us[x],k); // при входе в вершину сохраняем максимальный путь
  6.     forx(i,0,10){
  7.         if(g[x][i]==-1)
  8.             continue;
  9.         dfs(i,k+1); // запускаемся дальше в глубь графа
  10.     }
  11. }
  12. void solution() {
  13.     vector<int>p(5);
  14.     forx(i,0,5) // ввод приоритетов
  15.     cin>>p[i];
  16.     vector<int>w(5);
  17.     forx(i,0,5) // ввод весов
  18.     cin>>w[i];
  19.     vector<vector<int>>v(10,vector<int>(5,0));
  20.     forx(i,0,10)
  21.     forx(j,0,5)
  22.     cin>>v[i][j]; // ввод весов
  23.     forx(i,0,10){
  24.         forx(j,0,10){ // сравниваем каждый элемент со всеми
  25.             if(i==j)
  26.                 continue;
  27.             int a=0,b=0;
  28.             string s,u;
  29.             forx(k,0,5) { // цикл по каждому пункту
  30.                 if(v[i][k]>v[j][k] && p[k]==1 || v[i][k]<v[j][k] && p[k]==0){ если v[i] по k критерию лучше
  31.                     a+=w[k]; // сохраняем вес
  32.                     s+=" + "+to_string(w[k]);
  33.                     u+=" + 0";
  34.                 }
  35.                 if(v[i][k]<v[j][k] && p[k]==1 || v[i][k]>v[j][k] && p[k]==0) { если v[j] по k критерию лучше
  36.                     b += w[k];// сохраняем вес
  37.                     u+=" + "+to_string(w[k]);
  38.                     s+=" + 0";
  39.                 }
  40.                 if(v[i][k]==v[j][k]){
  41.                     u+=" + 0";
  42.                     s+=" + 0";
  43.                 }
  44.             }
  45.             s.erase(0,3);
  46.             u.erase(0,3);
  47.             if(b==0){ // ребра нет
  48.                 g[i][j]=INF;  
  49.             }
  50.             else{ // добавляем ребро
  51.                 double q=a*1./b;
  52.                 if(q>=1)
  53.                     g[i][j]=q;
  54.             }
  55.         }
  56.     }
  57.     forx(i,0,10)
  58.     forx(j,0,10)
  59.     if(g[i][j]<1.7 || g[i][j]==INF) // ограничение на вес ребра
  60.         g[i][j]=-1;
  61.     forx(i,0,10){ // вывод матрицы смежности
  62.         cout<<i+1<<"\t";
  63.         for(double& j:g[i])
  64.             cout<<j<<"\t";
  65.         printer();
  66.  
  67.     }
  68.     forx(i,0,10){ // запуск поиска в глубину из каждой вершины
  69.         dfs(i);
  70.     }
  71.     forx(i,0,10){ // вывод уровней
  72.         if(find(all(us),i+1)!=us.end())
  73.             cout<<"\n"<<i+1<<")";
  74.         forx(j,0,10)
  75.         if(us[j]==i+1)
  76.             cout<<"\t"<<j+1;
  77.     }
  78. }
  79. int32_t  main() {
  80.     SetConsoleCP(65001);
  81.     SetConsoleOutputCP(65001);
  82.     solution();
  83. }
Add Comment
Please, Sign In to add comment