刚才做了一道题,最小生成树,用vector+sort后T了,发现是sort导致的,想问一下原因
附上代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e3+5;
vector<pair<int,pair<int,int> > >g;
int n,m,fa[N],a[N];
int find(int x)
{
int r=x;
while(r!=fa[r]) r=fa[r];
while(x!=r)
{
int p=fa[x];
fa[x]=r;
x=p;
}
return r;
}
void join(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy) fa[fx]=fy;
}
int kruscal()
{
int ans=0,k=0;
for(int i=0;i<g.size();i++)
{
int u=g[i].second.first;
int v=g[i].second.second;
int w=g[i].first;
if(find(u)!=find(v))
{
join(u,v);
ans+=w;
++k;
if(k==n-1) return ans;
}
}
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(j>=i) continue;
g.push_back(make_pair(-(a[i]^a[j]),make_pair(i,j)));
g.push_back(make_pair(-(a[i]^a[j]),make_pair(j,i)));
}
}
double ft=clock();
sort(g.begin(),g.end());
double fe=clock();
cout<<fixed<<fe-ft<<endl;
int sum=kruscal();
cout<<sum*-1;
return 0;
}