Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <bits/stdc++.h>
- #include <unordered_map>
- #include <string>
- using namespace std;
- #define pb push_back
- #define ull unsigned long long
- #define ll long long
- #define F first
- #define S second
- #define PI acos(-1)
- #define EPS 1e-9
- #define BASE 31ll
- #define BASE2 53ll
- #define ld double
- #define MAX 1000000000
- #define NIL 0
- #define INF 1e15
- #define infi 1e16
- #define rd(a) scanf("%d",&a)
- #define rd2(a,b) scanf("%d %d",&a,&b)
- #define rd3(a,b,c) scanf("%d %d %d",&a,&b,&c)
- #define rdll(a) scanf("%I64d",&a)
- #define sz(a) (int) a.size()
- #define lp(i,a,n) for(int i=(a); i<=(n) ; ++i)
- #define lpd(i,n,a) for(int i=(n); i>=(a) ; --i)
- #define pi acos(-1)
- #define lc (x << 1)
- #define rc (x << 1 | 1)
- #define cp(a,b) ( (conj(a)*(b)).imag() ) // a*b sin(T), if zero -> parllel
- #define dp(a,b) ( (conj(a)*(b)).real() ) // a*b cos(T), if zero -> prep
- #define angle(a) (atan2((a).imag(), (a).real()))
- #define X real()
- #define Y imag()
- #define vec(a,b) ((b)-(a))
- typedef complex<double>point;
- typedef complex<double>CX;
- typedef pair<int,int>ii;
- typedef pair<ii,int>event;
- typedef pair<vector<int>,int>vii;
- typedef pair<int, int> pii;
- typedef pair<ll, ll> pll;
- typedef vector<int> vi;
- const int N=500005;
- ll mod=998244353;
- ll mod2=1000000009;
- ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }
- ll lcm(ll a, ll b) { return a * (b / gcd(a, b)); }
- bool is_vowel(char c){if(c=='a'||c=='e'||c=='i'||c=='o'||c=='u')return 1;return 0;}
- ld getDistance(ld x1,ld y1,ld x2,ld y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
- 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;}
- 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;}
- vector<ii>costs[505];
- int n,m;
- int dsu[505];
- int get(int a){
- return dsu[a]==a?a:dsu[a]=get(dsu[a]);
- }
- bool used[505];
- vector<int>extra[505],adj[505];
- bool merge(int a,int b){
- a=get(a);
- b=get(b);
- if(a==b)return 0;
- dsu[a]=b;
- return 1;
- }
- int bit[505],in[505],out[505],counter=1,par[505];
- void dfs(int node,int p){
- in[node]=counter++;
- par[node]=p;
- lp(i,0,(int)adj[node].size()-1){
- int to=adj[node][i];
- if(to==p)continue;
- dfs(to,node);
- }
- out[node]=counter-1;
- }
- void update(int idx){
- while(idx<=n){
- bit[idx]++;
- idx+=idx&-idx;
- }
- }
- int getValue(int idx){
- int ret=0;
- while(idx>0){
- ret+=bit[idx];
- idx-=idx&-idx;
- }
- return ret;
- }
- void add(int node){
- lp(i,0,(int)extra[node].size()-1){
- int to=extra[node][i];
- update(in[to]);
- }
- }
- void dfs2(int node,int p){
- add(node);
- lp(i,0,(int)adj[node].size()-1){
- int to=adj[node][i];
- if(to==p)continue;
- dfs2(to,node);
- }
- }
- int solve(int node){
- int mn=1000000;
- while(par[node]!=0){
- int s=in[node],e=out[node];
- int sum=getValue(n)-(getValue(e)-getValue(s-1))+1;
- mn=min(mn,sum-1);
- node=par[node];
- add(node);
- }
- return mn;
- }
- int main() {
- freopen("test.in","r",stdin);
- rd2(n,m);
- lp(i,1,m){
- int a,b,c;
- rd3(a,b,c);
- costs[c].pb(ii(a,b));
- }
- int sum=0;
- lp(i,0,n)dsu[i]=i;
- lp(i,0,500){
- lp(j,0,(int)costs[i].size()-1){
- ii cur=costs[i][j];
- used[j]=(get(cur.F)!=get(cur.S));
- }
- vector<ii>save;
- lp(j,0,(int)costs[i].size()-1){
- ii cur=costs[i][j];
- bool is =merge(cur.F,cur.S);
- if(is==0){
- save.pb(cur);
- }
- else{
- adj[cur.F].pb(cur.S);
- adj[cur.S].pb(cur.F);
- }
- }
- lp(j,0,(int)costs[i].size()-1){
- if(used[j])continue;
- memset(bit,0,sizeof(bit));
- memset(par,0,sizeof(par));
- counter=1;
- ii cur=costs[i][j];
- dfs(cur.F,0);
- dfs2(cur.S,par[cur.S]);
- sum+=solve(cur.S);
- }
- lp(j,0,(int)save.size()-1){
- ii cur=save[j];
- extra[cur.F].pb(cur.S);
- extra[cur.S].pb(cur.F);
- }
- }
- cout<<sum;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement