a53

Dijkstra2

a53
Jan 30th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.50 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <set>
  5. #include <queue>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9. #define ii pair<int,int>
  10. #define pb push_back
  11. #define inf 1000000000
  12. int n,e,source;
  13. vector<ii> g[100000];
  14. int dist[100000];
  15. bool marked[100000];
  16. ifstream fin("dijkstra2.in");
  17. ofstream fout("dijkstra2.out");
  18. void apply_dijkstra()
  19. {
  20. set<ii > s;
  21. s.insert(ii(0,source));
  22. dist[source] = 0;marked[source] = 1;
  23. while(!s.empty())
  24. {
  25. ii p = *s.begin();
  26. s.erase(p);
  27. marked[p.second] = 2;
  28. for(unsigned i=0;i<g[p.second].size();i++)
  29. if(marked[g[p.second][i].second]==0)
  30. {
  31. s.insert(ii(dist[p.second]+g[p.second][i].first,g[p.second][i].second));
  32. marked[g[p.second][i].second] = 1;
  33. dist[g[p.second][i].second] = dist[p.second]+g[p.second][i].first;
  34. }
  35. else if(marked[g[p.second][i].second]==1 && dist[g[p.second][i].second] > dist[p.second]+g[p.second][i].first)
  36. {
  37. s.erase(ii(dist[g[p.second][i].second],g[p.second][i].second));
  38. s.insert(ii(dist[p.second]+g[p.second][i].first,g[p.second][i].second));
  39. dist[g[p.second][i].second] = dist[p.second]+g[p.second][i].first;
  40. }
  41. }
  42. for(int i=1;i<=n;i++)
  43. {
  44. if(dist[i]==inf)
  45. fout<<-1<<' ';
  46. else
  47. fout<<dist[i]<<' ';
  48. }
  49. }
  50.  
  51. int main()
  52. {
  53. for(int i=0;i<100000;++i)
  54. dist[i]=inf;
  55. fin>>n>>e>>source;
  56. for(int i=0;i<e;i++)
  57. {
  58. int x,y,w;
  59. fin>>x>>y>>w;
  60. g[x].pb(ii(w,y)),g[y].pb(ii(w,x));
  61. }
  62. apply_dijkstra();
  63. return 0;
  64. }
Add Comment
Please, Sign In to add comment