Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef pair<int,int> pii;
  4. typedef long long ll;
  5. typedef pair<ll,ll> pll;
  6.  
  7. #define fi first
  8. #define se second
  9. #define pb push_back
  10. #define rank kgjksjsias
  11. const int MAXN = 30000+10;
  12.  
  13.  
  14. ll dif[MAXN];
  15.  
  16. vector<pll> g[MAXN];
  17.  
  18. set<pll> gr[MAXN];
  19.  
  20.  
  21. char used[MAXN];
  22. void dfs(int v){
  23. used[v]=1;
  24. for(pll x:g[v]){
  25. int to = x.se;
  26. if(!used[to]){
  27. dfs(to);
  28. }
  29. }
  30. }
  31.  
  32.  
  33. void merge_set(int a,int b){
  34. if(gr[a].size()<gr[b].size()){
  35. swap(gr[a],gr[b]);
  36. }
  37. for(pll x:gr[b]){
  38. ll len = x.fi;
  39. int to = x.se;
  40. len = len - dif[b] + dif[a];
  41. gr[a].insert({len,to});
  42. }
  43. }
  44. int parent[MAXN];
  45. int rank[MAXN];
  46. int find_parent(int v){
  47. if(v==parent[v]){
  48. return v;
  49. }
  50. return parent[v] = find_parent(parent[v]);
  51. }
  52.  
  53. void union_set(int a,int b){
  54. a = find_parent(a);
  55. b = find_parent(b);
  56. if(a!=b){
  57. if(rank[a]<rank[b])
  58. swap(a,b);
  59. else if(rank[a]==rank[b])
  60. rank[a]++;
  61. parent[b] = a;
  62. merge_set(a,b);
  63. }
  64. }
  65.  
  66.  
  67.  
  68. char us[MAXN];
  69.  
  70. void solve(){
  71. int n,m;
  72. cin >> n >> m;
  73. for(int i=1;i<=m;++i){
  74. int a,b,c;
  75. cin >> a >> b >> c;
  76. if(a==b)
  77. continue;
  78. g[a].pb({c,b});
  79. gr[b].insert({c,a});
  80. }
  81.  
  82. dfs(1);
  83. ll ans = 0;
  84. priority_queue<int> ver;
  85. for(int i=1;i<=n;++i){
  86. if(!used[i]){
  87. cout <<"NO";
  88. exit(0);
  89. }
  90.  
  91. parent[i] = i;
  92. if(i>1)
  93. ver.push(i);
  94. }
  95. stack<int> st;
  96. while(!ver.empty()){
  97. int v = ver.top(); ver.pop();
  98. if(find_parent(v)!=v || find_parent(v)==find_parent(1)){
  99. continue;
  100. }
  101. st.push(v);
  102.  
  103. while(1){
  104. us[v] = 1;
  105. pll x = *gr[v].begin(); gr[v].erase(gr[v].begin());
  106. ll len = x.fi + dif[v];
  107. int to = find_parent(x.se);
  108. if(find_parent(to)==find_parent(v))
  109. continue;
  110. ans+=len;
  111. if(find_parent(to)==find_parent(1)){
  112. while(!st.empty()){
  113. int x = st.top(); st.pop();
  114. union_set(x,1);
  115. }
  116. break;
  117. } else if(us[to]==0){
  118. st.push(to);
  119. v = to;
  120. } else {
  121. while(!st.empty()){
  122. int x = st.top(); st.pop();
  123. union_set(x,v);
  124. if(find_parent(x)==find_parent(to)){
  125. break;
  126. }
  127. }
  128. v = to;
  129. }
  130.  
  131. }
  132. }
  133.  
  134. cout <<"YES\n";
  135. cout << ans<<endl;
  136.  
  137. }
  138. int main(){
  139. #ifdef zxc
  140. freopen("input.txt","r",stdin);
  141. freopen("output.txt","w",stdout);
  142. #endif // zxc
  143. ios_base::sync_with_stdio(0);
  144. cin.tie(0);
  145. cout.tie(0);
  146. solve();;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement