Advertisement
Guest User

Untitled

a guest
Jul 21st, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.21 KB | None | 0 0
  1. #include <iostream>
  2. #include <bits/stdc++.h>
  3. #include <unordered_map>
  4. #include <string>
  5. using namespace std;
  6.  
  7. #define pb push_back
  8. #define ull unsigned long long
  9. #define ll long long
  10. #define F first
  11. #define S second
  12. #define PI acos(-1)
  13. #define EPS 1e-9
  14. #define BASE 31ll
  15. #define BASE2 53ll
  16. #define ld double
  17. #define MAX 1000000000
  18. #define NIL 0
  19. #define INF 1e15
  20. #define infi 1e16
  21. #define rd(a) scanf("%d",&a)
  22. #define rd2(a,b) scanf("%d %d",&a,&b)
  23. #define rd3(a,b,c) scanf("%d %d %d",&a,&b,&c)
  24. #define rdll(a) scanf("%I64d",&a)
  25. #define sz(a) (int) a.size()
  26. #define lp(i,a,n) for(int i=(a); i<=(n) ; ++i)
  27. #define lpd(i,n,a) for(int i=(n); i>=(a) ; --i)
  28. #define pi acos(-1)
  29. #define lc (x << 1)
  30. #define rc (x << 1 | 1)
  31. #define cp(a,b) ( (conj(a)*(b)).imag() ) // a*b sin(T), if zero -> parllel
  32. #define dp(a,b) ( (conj(a)*(b)).real() ) // a*b cos(T), if zero -> prep
  33. #define angle(a) (atan2((a).imag(), (a).real()))
  34. #define X real()
  35. #define Y imag()
  36. #define vec(a,b) ((b)-(a))
  37.  
  38.  
  39. typedef complex<double>point;
  40. typedef complex<double>CX;
  41. typedef pair<int,int>ii;
  42. typedef pair<ii,int>event;
  43. typedef pair<vector<int>,int>vii;
  44. typedef pair<int, int> pii;
  45. typedef pair<ll, ll> pll;
  46. typedef vector<int> vi;
  47.  
  48. const int N=500005;
  49.  
  50.  
  51. ll mod=998244353;
  52. ll mod2=1000000009;
  53. ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }
  54. ll lcm(ll a, ll b) { return a * (b / gcd(a, b)); }
  55. bool is_vowel(char c){if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u')return 1;return 0;}
  56. ld getDistance(ld x1,ld y1,ld x2,ld y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
  57. ll extended_euclidean(ll a,ll b,ll &x,ll &y){if(b==0){x=1;y=0;return a;}ll g = extended_euclidean(b,a%b,y,x);y -= (a/b)*x;return g;}
  58. ll power(ll base,ll p){if(p==1)return base;if(!p)return 1ll;ll ret=power(base,p/2);ret*=ret;ret%=mod;if(p&1)ret*=base;return ret%mod;}
  59.  
  60. vector<ii>costs[505];
  61. int n,m;
  62. int dsu[505];
  63. int get(int a){
  64. return dsu[a]==a?a:dsu[a]=get(dsu[a]);
  65. }
  66. bool used[505];
  67. vector<int>extra[505],adj[505];
  68. bool merge(int a,int b){
  69. a=get(a);
  70. b=get(b);
  71. if(a==b)return 0;
  72. dsu[a]=b;
  73. return 1;
  74. }
  75. int bit[505],in[505],out[505],counter=1,par[505];
  76. void dfs(int node,int p){
  77. in[node]=counter++;
  78. par[node]=p;
  79. lp(i,0,(int)adj[node].size()-1){
  80. int to=adj[node][i];
  81. if(to==p)continue;
  82. dfs(to,node);
  83. }
  84. out[node]=counter-1;
  85. }
  86. void update(int idx){
  87. while(idx<=n){
  88. bit[idx]++;
  89. idx+=idx&-idx;
  90. }
  91. }
  92. int getValue(int idx){
  93. int ret=0;
  94. while(idx>0){
  95. ret+=bit[idx];
  96. idx-=idx&-idx;
  97. }
  98. return ret;
  99. }
  100. void add(int node){
  101. lp(i,0,(int)extra[node].size()-1){
  102. int to=extra[node][i];
  103. update(in[to]);
  104. }
  105. }
  106. void dfs2(int node,int p){
  107. add(node);
  108. lp(i,0,(int)adj[node].size()-1){
  109. int to=adj[node][i];
  110. if(to==p)continue;
  111. dfs2(to,node);
  112. }
  113. }
  114. int solve(int node){
  115. int mn=1000000;
  116. while(par[node]!=0){
  117. int s=in[node],e=out[node];
  118. int sum=getValue(n)-(getValue(e)-getValue(s-1))+1;
  119. mn=min(mn,sum-1);
  120. node=par[node];
  121. add(node);
  122. }
  123. return mn;
  124. }
  125. int main() {
  126. freopen("test.in","r",stdin);
  127. rd2(n,m);
  128. lp(i,1,m){
  129. int a,b,c;
  130. rd3(a,b,c);
  131. costs[c].pb(ii(a,b));
  132. }
  133. int sum=0;
  134. lp(i,0,n)dsu[i]=i;
  135. lp(i,0,500){
  136. lp(j,0,(int)costs[i].size()-1){
  137. ii cur=costs[i][j];
  138. used[j]=(get(cur.F)!=get(cur.S));
  139. }
  140. vector<ii>save;
  141. lp(j,0,(int)costs[i].size()-1){
  142. ii cur=costs[i][j];
  143. bool is =merge(cur.F,cur.S);
  144. if(is==0){
  145. save.pb(cur);
  146. }
  147. else{
  148. adj[cur.F].pb(cur.S);
  149. adj[cur.S].pb(cur.F);
  150. }
  151. }
  152. lp(j,0,(int)costs[i].size()-1){
  153. if(used[j])continue;
  154. memset(bit,0,sizeof(bit));
  155. memset(par,0,sizeof(par));
  156. counter=1;
  157. ii cur=costs[i][j];
  158. dfs(cur.F,0);
  159. dfs2(cur.S,par[cur.S]);
  160. sum+=solve(cur.S);
  161. }
  162. lp(j,0,(int)save.size()-1){
  163. ii cur=save[j];
  164. extra[cur.F].pb(cur.S);
  165. extra[cur.S].pb(cur.F);
  166. }
  167. }
  168. cout<<sum;
  169. return 0;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement