Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.58 KB | None | 0 0
  1. #include <vector>
  2. #include <set>
  3. #include <iostream>
  4.  
  5.  
  6. using namespace std;
  7.  
  8. struct Edge {
  9. long long a, b, cos;
  10. };
  11.  
  12. using ll = long long;
  13.  
  14. const ll INF = 1e15 + 3;
  15. set<long long> changes;
  16. vector<bool> used;
  17. vector<vector<long long>> g;
  18.  
  19. void dfs(long long v) {
  20. if (used[v]) return;
  21. changes.insert(v);
  22. used[v] = 1;
  23. for (long long u : g[v]) dfs(u);
  24. }
  25.  
  26. int main() {
  27. freopen("path.in", "r", stdin);
  28. freopen("path.out", "w", stdout);
  29. ll n, m, s;
  30. cin >> n >> m >> s;
  31. vector<Edge> edges;
  32. used.resize(n + 1);
  33. g.resize(n + 1);
  34. for (long long i = 0; i < m; i++) {
  35. ll v1, v2, w;
  36. cin >> v1 >> v2 >> w;
  37. edges.push_back({v1, v2, w});
  38. g[v1].push_back(v2);
  39. }
  40. ll dist[n + 1];
  41. for (long long i = 0; i <= n; i++) dist[i] = INF;
  42. dist[s] = 0;
  43. for (long long i = 0; i <= n; i++) {
  44. for (Edge u : edges) {
  45. if (dist[u.a] != INF)
  46. dist[u.b] = min(min(dist[u.b], dist[u.a] + u.cos), INF);
  47. }
  48. }
  49. for (long long i = 0; i <= n; i++) {
  50. for (Edge u : edges) {
  51. if (dist[u.b] > dist[u.a] + u.cos && dist[u.a] != INF) {
  52. changes.insert(u.b);
  53. dfs(u.b);
  54. dist[u.b] = min(min(dist[u.b], dist[u.a] + u.cos), INF);
  55. }
  56. }
  57. }
  58. for (long long i = 1; i <= n; i++) {
  59. if (dist[i] >= INF)
  60. cout << "*" << endl;
  61. else if
  62. (changes.count(i)) cout << "-" << endl;
  63. else
  64. cout << dist[i] << endl;
  65. }
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement