Advertisement
Guest User

Untitled

a guest
Dec 7th, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <fstream>
  4. #define inf 9999
  5. using namespace std;
  6. //---zmienne_globalne----
  7. struct Edge
  8. {
  9. int weight;
  10. int beg;
  11. int end;
  12. }*E;
  13. int n,m;
  14. int *bell;
  15. //-----------------------
  16. void wczytaj(void);
  17. bool Bellman(Edge *e,int wielkosc , int licznik);
  18. void zmiana_wag(Edge *e, int *h,int m);
  19. int *Dijkstry(int s, int n);
  20. void finalizacja(int *h , int **q2);
  21.  
  22. int main()
  23. {
  24. wczytaj();
  25.  
  26. for(int i=0; i<m; i++)
  27. {
  28. cout<<E[i].beg<<" "<<E[i].end<<" "<<E[i].weight <<endl;
  29. }
  30. cout<<endl;
  31. cout<<m<<endl;
  32. bool wykonaj;
  33. int *q=new int[n+1];
  34. int **q2=new int*[n];
  35.  
  36. wykonaj=Bellman(E,n+1, m);
  37. if(wykonaj==true){
  38. int *h=bell;
  39. zmiana_wag(E,h, m);
  40.  
  41. for(int i=0;i<=n;i++){
  42. q2[i]=Dijkstry(i, n);
  43. }
  44.  
  45. for(int i=0;i<=n;i++){
  46. for(int j=0;j<=n;j++){
  47. cout<<q2[i][j]<<" ";
  48. }
  49. cout<<endl;
  50. }
  51.  
  52. finalizacja(h,q2);
  53.  
  54. //----zwolnienie pamieci----
  55. for(int i=0;i<n+1;i++){
  56. delete [] q2[i];
  57. }
  58.  
  59. delete [] h;
  60.  
  61. }
  62. else{
  63. cout<<"Algorytm Johnsona nie zadzia³a";
  64. }
  65. delete [] q;
  66. delete [] *q2;
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73. }
  74. bool Bellman(Edge *e, int wielkosc, int m)
  75. {
  76. bell=new int [wielkosc];
  77. for(int i=0; i<wielkosc; i++)bell[i]=0;
  78. bool sprawdz=false;
  79. while(!sprawdz)
  80. {
  81. sprawdz=true;
  82. for(int i=0; i<m; i++)
  83. {
  84. if(bell[e[i].end]>bell[e[i].beg]+e[i].weight)
  85. {
  86. bell[e[i].end]=bell[e[i].beg]+e[i].weight;
  87. sprawdz=false;
  88. }
  89. }
  90. }
  91.  
  92. for(int i=0;i<m;i++){
  93. if(bell[e[i].end]>(bell[e[i].beg]+e[i].weight))return false;
  94. }
  95. return true;
  96. }
  97.  
  98.  
  99.  
  100. int *Dijkstry(int s, int n)
  101. {
  102. //-------tworzenie macierzy wag-----------
  103. int **A=new int*[n+1];
  104. for(int i=0;i<=n;i++)A[i]=new int[n+1];
  105.  
  106. for(int i=0;i<=n;i++){
  107. for(int j=0;j<=n;j++){
  108. if(i==j){
  109. A[i][j]=0;
  110. }
  111. else{
  112. A[i][j]=inf;
  113. }
  114.  
  115. }
  116. }
  117. for(int i=0;i<m;i++){
  118. A[E[i].beg][E[i].end]=E[i].weight;
  119. }
  120.  
  121. /* for(int i=1;i<=n;i++){
  122. for(int j=1;j<=n;j++){
  123. cout<<A[i][j]<<" ";
  124. }
  125. cout<<endl;
  126. }*/
  127. //----------------------------------------------
  128.  
  129. int *dist=new int[n+1];
  130. int *pred=new int[n+1];
  131.  
  132. int* fin = new int[n+1];
  133. for (int v = 0; v <= n; v++) {
  134. dist[v] = inf;
  135. fin[v] = 0;
  136. pred[v] = -1;
  137. }
  138. dist[s] = 0;
  139. fin[s] = 1;
  140. int last = s, y = 0, temp = inf;
  141.  
  142. for (int i = 1; i < n; i++) {
  143. for (int v = 0; v <= n; v++) {
  144. if ((A[last][v] < inf) && (fin[v] == 0)) {
  145. if (dist[last] + A[last][v] < dist[v]) {
  146. dist[v] = dist[last] + A[last][v];
  147. pred[v] = last+1;
  148. }
  149. }
  150. temp = inf;
  151. y = 0;
  152. for (int u = 0; u < n; u++) {
  153. if ((fin[u] == 0) && (dist[u] < temp)) {
  154. y = u;
  155. temp = dist[u];
  156. }
  157. }
  158. }
  159. if (temp < inf) {
  160. fin[y] = 1;
  161. last = y;
  162. }
  163. }
  164.  
  165. delete[] fin;
  166.  
  167. // cout<<endl<<"!";
  168. // for(int i=1;i<=n;i++)cout<<dist[i]<<" ";
  169. return dist;
  170.  
  171. }
  172. void zmiana_wag(Edge *e, int *h, int m)
  173. {
  174. for(int i=0; i<m; i++)
  175. {
  176. e[i].weight=e[i].weight+h[e[i].beg]-h[e[i].end];
  177. }
  178. }
  179. void finalizacja(int *h, int **q2)
  180. {
  181.  
  182. int **D=new int*[n];
  183. for(int i=0;i<n;i++){
  184. D[i]=new int[n];
  185. }
  186.  
  187. cout<<endl;
  188. for(int i=0;i<=n;i++)cout<<h[i]<<" ";
  189. cout<<endl;
  190. cout<<endl;
  191. for(int i=0;i<n;i++){
  192. for(int j=0;j<n;j++){
  193. if(q2[i+1][j+1]==inf || h[j+1]==inf || h[i+1]==inf){
  194. D[i][j]=inf;
  195. }
  196. else{
  197. D[i][j]=q2[i+1][j+1]+h[j+1]-h[i+1];
  198. }
  199.  
  200.  
  201. }
  202. }
  203. //----zapis------
  204. ofstream out;
  205. out.open("Out0502.txt");
  206. for(int i=0;i<n;i++){
  207. for(int j=0;j<n;j++){
  208. out<<D[i][j]<<" ";
  209. }
  210. out<<'\n';
  211. }
  212. out.close();
  213. //------zwolnienie pamieci----
  214. for(int i=0;i<n;i++){
  215. delete [] D[i];
  216. }
  217. delete [] *D;
  218.  
  219. }
  220. void wczytaj(void)
  221. {
  222. int i=0, licznik=0,sumka=0,s=0;
  223. ifstream wej;
  224. wej.open("In0502.txt");
  225. int pom2[100]= {0};
  226. string pom;
  227. while(!wej.eof())
  228. {
  229. getline(wej,pom);
  230. sumka=0;
  231. for(int k=0; k<pom.size(); k++)
  232. {
  233.  
  234. if(pom[k]==' ')
  235. {
  236. sumka++;
  237. licznik++;
  238. }
  239. }
  240. pom2[i]=sumka+1;
  241. if(pom.size()>0)
  242. licznik++;
  243. sumka=0;
  244. i++;
  245. }
  246. wej.close();
  247. wej.open("In0502.txt");
  248. wej>>n;
  249. int x=1;
  250. licznik=licznik/2;
  251. E = new Edge[licznik];
  252. m=licznik;
  253. i=0;
  254. while(!wej.eof())
  255. {
  256. for(int j=1; j<pom2[x]; j=j+2)
  257. {
  258.  
  259. wej>>E[i].end;
  260. wej>>E[i].weight;
  261. E[i].beg=x;
  262. i++;
  263. }
  264. x++;
  265. }
  266.  
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement