tanasaradu

Untitled

Oct 25th, 2017
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. ifstream fin("hamilton.in");
  4. ofstream fout("hamilton.out");
  5. const int PMAX=(1<<19);
  6. const short NMAX=19;
  7. const int inf=1000000000;
  8. int n,m,dp[NMAX][PMAX],M[NMAX][NMAX];
  9. ///dp[i][j]-costul minim de la nodul 0 la nodul i trecand prin j valori
  10. ///binare(j fiind maxim 18)
  11. vector<int>L[NMAX];
  12. queue<pair<int,int> >C;
  13. inline void READ()
  14. {
  15. fin>>n>>m;
  16. for(int i=0;i<n;i++)
  17. for(int j=0;j<n;j++)
  18. M[i][j]=inf;
  19. for(int i=1;i<=m;i++)
  20. {
  21. int nod,nod1,cost;
  22. fin>>nod>>nod1>>cost;
  23. L[nod].push_back(nod1);
  24. M[nod][nod1]=cost;
  25. }
  26. }
  27. inline void DP_SOLVE()
  28. {
  29. int bit,sol;
  30. bit=(1<<n)-1;
  31. for(int i=0;i<n;i++)
  32. for(int j=0;j<=bit;j++)
  33. dp[i][j]=inf;
  34. dp[0][1]=0;
  35. C.push({0,1});
  36. ///1- are bitul 0=1
  37. while(!C.empty())
  38. {
  39. int x=C.front().first;
  40. int y=C.front().second;
  41. C.pop();
  42. int lug=L[x].size();
  43. for(int pas=0;pas<lug;pas++)
  44. {
  45. int i=L[x][pas];
  46. if((y&(1<<i))==0) ///verific daca bitul i al lui y este 0
  47. {
  48. int stare;
  49. stare=(y|(1<<i));
  50. ///trec la numarul care are bitul i=1
  51. if(dp[i][stare]>dp[x][y]+M[x][i])
  52. {
  53. dp[i][stare]=dp[x][y]+M[x][i];
  54. C.push({i,stare});
  55. }
  56. }
  57. }
  58. }
  59. sol=inf;
  60. for(int i=1;i<n;i++)
  61. sol=min(sol,dp[i][bit]+M[i][0]);
  62. ///bit are n biti de 1,inseamna ca am trecut prin cele n noduri
  63. if(sol==inf)
  64. fout<<"Nu exista solutie\n";
  65. else fout<<sol<<"\n";
  66.  
  67. }
  68. int main()
  69. {
  70. READ();
  71. DP_SOLVE();
  72. fin.close();
  73. fout.close();
  74. return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment