Advertisement
Guest User

do_laba1

a guest
Sep 24th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.45 KB | None | 0 0
  1. #include <iostream>
  2. #include <bits/stdc++.h>
  3. #include <vector>
  4. #include <fstream>
  5.  
  6. using namespace std;
  7.  
  8. /*Алгоритм проверки графа на двудольность, используя обход в ширину
  9. Произведём серию поисков в ширину.
  10. Т.е. будем запускать поиск в ширину из каждой непосещённой вершины.
  11. Ту вершину, из которой мы начинаем идти, мы помещаем в первую долю.
  12. В процессе поиска в ширину, если мы идём в какую-то новую вершину,
  13. то мы помещаем её в долю, отличную от доли текущей вершину.
  14. Если же мы пытаемся пройти по ребру в вершину, которая уже посещена,
  15. то мы проверяем, чтобы эта вершина и текущая вершина находились в разных долях.
  16. В противном случае граф двудольным не является.
  17. По окончании работы алгоритма мы либо обнаружим, что граф не двудолен,
  18. либо найдём разбиение вершин графа на две доли.*/
  19.  
  20.  
  21. int main() {
  22. ofstream out("out.txt");
  23. ifstream in("in.txt");
  24. int n,j=0,k=0,d=0;
  25. int s; // стартовая вершина (вершины везде нумеруются с нуля)
  26. // чтение графа
  27. in >> n;
  28. //cout << n << endl;
  29. vector < vector<int> > g(n,vector<int>(n)); // граф матрицей смежности
  30.  
  31. for (int i=0;i<n;i++)
  32.     {
  33.         for (int j=0;j<n;j++)
  34.         {
  35.              in >> s;
  36.              g[i][j]=s;
  37.        //    cout << g[i][j] << " ";
  38.         }
  39.     //  cout << endl;
  40.     }
  41. in.close();
  42.  
  43. s=0;
  44. queue <int> q;
  45. q.push (s);
  46. vector <bool> used(n,false);
  47. vector <int> metki(n);
  48. vector <int> first(n);
  49. vector <int> second(n);
  50. used[s] = true;
  51. for (int i=0;i<n;i++)
  52. {metki[i]= 0;}
  53. metki[s] = 1;
  54. while (!q.empty()) {
  55.     int v = q.front();
  56.     q.pop();
  57.     //cout<<"v="<<v<<endl;
  58.     for (int i=0; i<n; ++i) {
  59.         int to = i;
  60. //cout<<"to="<<to<<endl;
  61.         if((used[to])  and (g[v][i] == 1)){
  62.             if((metki[to]!= 0) and (metki[to]==metki[v]) and (v!=i))
  63.             {
  64.           // cout<<"No"<<endl;
  65.              d=1;
  66.              break;
  67.             }
  68.         }
  69.         if((!used[to]) and (g[v][i] == 1)){
  70.             used[to] = true;
  71.             q.push (to);
  72.     //cout<<"metki[to]="<<metki[to]<<endl;
  73.             if((metki[to]!= 0) and (metki[to]==metki[v]) and (v!=i))
  74.             {
  75.           // cout<<"No";d=0;break;
  76.             }
  77.             if((metki[to]==0)and(metki[v]==1))
  78.             {
  79.                 metki[to]=2;
  80.             }
  81.             if((metki[to] ==0)and(metki[v]==2))
  82.             {
  83.                 metki[to]=1;
  84.             }
  85.         //  cout<<"metki[to]="<<metki[to]<<endl;
  86.         }
  87.     }
  88. }
  89. if (d==1){out<<"N";}
  90. if (d==0) {
  91. out<<"Y"<<endl;
  92. for (int i=0;i<n;i++)
  93. { //cout<<metki[i]<<"metki=";
  94.     if (metki[i]==1)
  95.        {first[j]=i+1; j++; }
  96.     if (metki[i]==2)
  97. {second[k]=i+1; k++;}
  98. }
  99. if(first[0]==1)
  100. {for (int i=0;i<j;i++)
  101.   {out<<first[i]<<" ";}
  102.   out<<endl; out<<0<<endl;
  103.   for (int i=0;i<k;i++)
  104.   {out<<second[i]<<" ";}
  105.   }
  106. if(first[0]!=1)
  107. {  for (int i=0;i<k;i++)
  108.   {out<<second[i]<<" ";}
  109.   out<<endl; out<<0<<endl;
  110.   for (int i=0;i<j;i++)
  111.   {out<<first[i]<<" ";}
  112.   }
  113. }
  114. out.close();
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement