Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.89 KB | None | 0 0
  1. // Zestaw zadania 2,3,5 PS0506
  2. #include <iostream> //basic stream
  3. #include <random>   //random gen
  4. #include <fstream>  //files
  5. #include <cstdlib>   //wowowowo
  6. #include <queue>
  7. using namespace std;//namespace
  8. /* functions headers
  9.  */
  10. void OdczytPlecak(int n,int *p,int *w); //wczytuje dane o przedmiotach do tablic
  11. void OdczytPlecak(int &n,int &w); //odczytuje udzwig i ilosc przedmiotow
  12. void AlgorytmPlecak(int *p,int *w, int n, int W);//glowny algorytm
  13. void GetDijkstra(int &n,int &u);
  14. void GetDijkstra(int **tab);
  15. void SaveDijkstra(int n,int *dist,int *pred);
  16. void AlgorytmDijkstra(int s,int n,int **A,int *dist,int *pred);
  17. int findi(int i, int parent[]);
  18. void onion(int parent[], int x, int y);
  19. /* classes
  20.  */
  21. /* main
  22.  */
  23. int main(int argc, char const *argv[]) {
  24.         system("clear");
  25.         /**/
  26.         //Plecak
  27.         /**/
  28.         int m,W;
  29.         // n to liczba przedmiotow mozliwych do zebrania
  30.         // w to udzwig plecaka
  31.  
  32.         OdczytPlecak(m,W); // odczyt ilosci przedmiotow i udzwigu
  33.  
  34.         // inicjalizacja tablic
  35.         int *p = new int[m];
  36.         int *w = new int[m];
  37.  
  38.         OdczytPlecak(m,p,w); // wczytanie danych o przedmiotach do tablicy
  39.  
  40.         AlgorytmPlecak(p,w,m,W); // glowny AlgorytmPlecak
  41.  
  42.  
  43.         //zwolnienie pamieci po tablicach dynamicznych
  44.         delete[] p;
  45.         delete[] w;
  46.         /**/
  47.         //Dijkstra
  48.         /**/
  49.         //Pozyskanie danych wejsciowych
  50.         int n,u;
  51.         GetDijkstra(n,u);
  52.         /**/
  53.         // Inicjalizacj tablic
  54.         int **tab;
  55.         int *dist;
  56.         int *pred;
  57.         tab = new int * [n+1];
  58.         for(int i=0; i<n+1; i++) {tab[i] = new int [n+1];}
  59.         dist = new int[n+1];
  60.         pred = new int[n+1];
  61.         /**/
  62.         //Wypelnienie tablicy danymi z pliku tekstowego
  63.         GetDijkstra(tab);
  64.         /**/
  65.         //Glowny AlgorytmDijkstra
  66.         AlgorytmDijkstra(u,n,tab,dist,pred);
  67.         /**/
  68.         //Zapis tablic pred i dist do pliku tekstowego
  69.         SaveDijkstra(n,dist,pred);
  70.         /**/
  71.         // Zwalnianie pamieci po tablicach
  72.         for(int i=0; i<n+1; i++) {delete [] tab[i];}
  73.         delete [] tab;
  74.         delete [] dist;
  75.         delete [] pred;
  76.         /**/
  77.         /**/
  78.         //Kruskal
  79.         /**/
  80.         //Pozyskanie danych wejsciowych4
  81.         int n2,m2;
  82.         ifstream plik("In0303.dll");
  83.         if(plik.fail())
  84.                 cout << "error" << endl;
  85.         plik>>n2; //ilosc wierzcholkow
  86.         plik>>m2; //ilosc krawedzi
  87.         priority_queue< pair<int,pair<int,int> >, vector<pair<int,pair<int,int> > >,greater <pair<int,pair<int,int> > > > que;
  88.         int pom,pom2; //pom do ktorego, pom2 za ile(koszt)
  89.         int zap,i=1;
  90.         plik>>pom>>pom2;
  91.         que.push(make_pair(pom2,make_pair(i,pom)));
  92.         zap=pom;
  93.  
  94.         while(!plik.eof()) {
  95.                 plik>>pom>>pom2;
  96.                 if(pom>zap) {
  97.                         que.push(make_pair(pom2,make_pair(i,pom)));
  98.  
  99.                         zap=pom;
  100.                 }
  101.                 else {
  102.                         i++;
  103.                         que.push(make_pair(pom2,make_pair(i,pom)));
  104.  
  105.                         zap=pom;
  106.                 }
  107.         }
  108.         plik.close();
  109.         pair<int,pair<int,int> > pomm;
  110.         vector<int> pomv;
  111.         int sum=0;
  112.         int odw[n2+1];
  113.         for(int i=0; i<=n2; i++) odw[i] = i;
  114.         while(!que.empty()) {
  115.                 pomm = que.top();
  116.  
  117.                 if(findi(pomm.second.first,odw)!=findi(pomm.second.second,odw)) {
  118.                         onion(odw,pomm.second.first,pomm.second.second);
  119.                         pomv.push_back(pomm.second.first);
  120.                         pomv.push_back(pomm.second.second);
  121.                         pomv.push_back(pomm.first);
  122.                         sum+=pomm.first;
  123.                 }
  124.                 que.pop();
  125.         }
  126.  
  127.         fstream plikk;
  128.         plikk.open("Out0303.dll",ios::out);
  129.         plikk<<sum<<endl;
  130.         for(int i=0; i<pomv.size(); i++) {
  131.                 if((i+1)%3==0) {
  132.                         plikk<<"["<<pomv[i]<<"], ";
  133.                 }
  134.                 else{
  135.                         plikk<<pomv[i]<<" ";
  136.                 }
  137.         }
  138.         plikk.close();
  139.         return 0;
  140. }
  141. /* functions bodies
  142.  */
  143. void OdczytPlecak(int n,int *p,int *w){
  144.         ifstream plik("In0302.dll");
  145.         if(plik.fail())
  146.                 cout << "error" << endl;
  147.         int pom;
  148.         plik>>pom>>pom;
  149.         for(int i=0; i<n; i++) {
  150.                 plik>>p[i];
  151.                 plik>>w[i];
  152.         }
  153.         plik.close();
  154. }
  155. void OdczytPlecak(int &n,int &w){
  156.         ifstream plik("In0302.dll");
  157.         if(plik.fail())
  158.                 cout << "error" << endl;
  159.         plik>>n; // ilosc przedmiotow ktore mozesz zebrac
  160.         plik>>w; // udzwig plecaka
  161.         plik.close();
  162. }
  163. void AlgorytmPlecak(int *p,int *w, int n, int W){
  164.         int pom;
  165.         int S1[W+1][n+1];
  166.         int S2[W+1][n+1];
  167.         // generowanie tablic S1 oraz S2
  168.         for(int i=0; i<=W; i++) {
  169.                 S1[i][0]=0; S2[i][0]=0;
  170.         }
  171.         for(int i=0; i<n+1; i++) {
  172.                 S1[0][i]=0; S2[0][i]=0;
  173.         }
  174.         for(int i=1; i<=W; i++) {
  175.                 for(int j=1; j<=n; j++)
  176.                 {
  177.                         S2[i][j]=0;
  178.                 }
  179.         }
  180.         for(int i=1; i<=W; i++) {
  181.                 for(int j=1; j<=n; j++) {
  182.                         if(i-w[j-1]>=0) {
  183.                                 pom=S1[i-w[j-1]][j-1]+p[j-1];
  184.                                 if(pom<S1[i][j-1]) {
  185.                                         S1[i][j]=S1[i][j-1];
  186.                                 }
  187.                                 else{
  188.                                         S1[i][j]=pom;
  189.                                         S2[i][j]=1;
  190.                                 }
  191.                         }
  192.                         else  {
  193.                                 S1[i][j]=S1[i][j-1];
  194.                         }
  195.                 }
  196.         }
  197.         //zapis do pliku
  198.         fstream plik("Out0302.dll",ios::out);
  199.         int maks=0,j1,pomocnicza;
  200.         for(int i=1; i<=W; i++)
  201.         {
  202.                 for(int j=1; j<=n; j++)
  203.                 {
  204.                         if(S1[i][j]>maks)
  205.                                 maks=S1[i][j];
  206.                 }
  207.         }
  208.         for(int i=1; i<=W; i++) {
  209.                 for(int j=1; j<=n; j++)  {
  210.                         if(S1[i][j]==maks)    {
  211.                                 pomocnicza=maks;
  212.                                 j1=j;
  213.                                 plik<<j1<<" ";
  214.                                 while(pomocnicza>0)    {
  215.                                         pomocnicza-=w[j1-1];
  216.                                         while(S1[pomocnicza][j1]==S1[pomocnicza][j1-1])
  217.                                                 j1-=1;
  218.                                         if(j1==0) break;
  219.                                         plik<<j1<<" ";
  220.                                 }
  221.                                 plik<<endl;
  222.                         }
  223.                 }
  224.         }
  225.         plik.close();
  226. }
  227. void GetDijkstra(int &n,int &u){
  228.         ifstream plik("In0305.dll");
  229.         if(plik.fail())
  230.                 cout << "error" << endl;
  231.         plik>>n; //ilosc wierzcholkow
  232.         plik>>u; //adres ujscia
  233.         plik.close();
  234. }
  235. void GetDijkstra(int **tab){
  236.         ifstream plik("In0305.dll");
  237.         int n,u;
  238.         if(plik.fail())
  239.                 cout << "error" << endl;
  240.         plik>>n; //ilosc wierzcholkow
  241.         plik>>u; //adres ujscia
  242.         for(int j=1; j<=n; j++) {
  243.                 for(int i=1; i<=n; i++) {
  244.                         plik >> tab[i][j];
  245.                 }
  246.         }
  247.         plik.close();
  248. }
  249. void SaveDijkstra(int n,int *dist,int *pred){
  250.         fstream plik;
  251.         plik.open("Out0305.dll",ios::out);
  252.         plik<<"dist[";
  253.         for(int i=1; i<=n; i++) {plik<<dist[i]<<" ";}
  254.         plik<<"]"<<endl;
  255.         plik<<"pred[";
  256.         for(int i=1; i<=n; i++) {plik<<pred[i]<<" ";}
  257.         plik<<"]";
  258.         plik.close();
  259. }
  260. void AlgorytmDijkstra(int s,int n,int **A,int *dist,int *pred){
  261.         int pom; //pom
  262.         //graf od 1, nie od 0
  263.         for(int i=1; i<=n; i++) dist[i] = 214783647; //-1 = inf
  264.         dist[n] = 0;
  265.         for(int i=1; i<=n; i++) pred[i] = -1;
  266.         priority_queue< pair<int,int>, vector<pair<int,int> >,greater <pair<int,int> > > que;
  267.         //priority_queue<int> -> deklaracja kolejki priorytetowej
  268.         //  priority_queue< pair<int,int>, vector<pair<int,int> >,greater <pair<int,int> > > que ->
  269.         //  deklaracja kolejki priortetowej rosnacej zawierajacej pary, pary sortuje najpierw po .first ,jesli rowny to po .second
  270.         que.push(make_pair(0,s)); //dodajemy wierzcholek startowy, waga=0, id wierzcholka = s (startowy)
  271.         //que.top().second=id_wierzcholka, j=id_sasiad.pl
  272.         while(!que.empty()) {
  273.                 pom=que.top().second;
  274.                 for(int j=1; j<=n; j++) { // sprawdza czy dla pom wierzcholka istnieje sasiad
  275.                         if(A[pom][j]!=-1) { // \/istnieje droga
  276.                                 if((dist[pom]+A[pom][j])<dist[j]) { // jezeli droga sie poprawia to jest aktualizowana
  277.                                         pred[j]=pom; // z tego wierzchloka obecnie jest najbardziej optylalna droga
  278.                                         dist[j]=dist[pom]+A[pom][j]; // aktaulizacja sumy wag drogi
  279.                                         que.push(make_pair(dist[j],j));
  280.                                 }
  281.                         }
  282.                 }
  283.                 que.pop();
  284.         }
  285. }
  286. int findi(int i, int parent[])
  287. {
  288.         if (parent[i] == i)
  289.                 return i;
  290.         return findi(parent[i], parent);
  291. }
  292. void onion(int parent[], int x, int y)
  293. {
  294.         int xset = findi(x, parent);
  295.         int yset = findi(y, parent);
  296.         parent[xset] = yset;
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement