Kruscal 算法
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int max_n=1005;
const int max_m=100005;
LL ans;
int n,m;
int fa[max_n];
struct Edge{
int u;
int v;
int w;
bool operator <(const Edge ee) const{
return w<ee.w;
}
}e[max_m];
void init()
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
}
int find(int x)
{
if(fa[x]!=x)
{
fa[x]=find(fa[x]);
}
return fa[x];
}
int main()
{
cin>>n>>m;
init();
int u,v,w;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
}
sort(e,e+m);
for(int i=0;i<m;i++)
{
u=e[i].u;
v=e[i].v;
w=e[i].w;
if(find(u)!=find(v))
{
ans+=w;
fa[find(u)]=find(v);
}
}
cout<<ans;
return 0;
}
prim 算法
超时 的优先队列 只得了70分,
#include<iostream>
using namespace std;
#include<queue>
#include<cstring>
#include<vector>
typedef long long LL;
int n,m;
int h[1005];
int ne[100005];
int idx;
LL ans;
int vis[1005];
struct Eage{
int v;
int len;
bool operator<(const Eage & aa) const{
return len>aa.len;
}
}e[100005];
priority_queue<Eage> qq;
void init()
{
memset(h,-1,sizeof(h));
}
void add(int u,int v,int w)
{
e[idx].v=v;
e[idx].len=w;
ne[idx]=h[u];
h[u]=idx++;
}
void prim()
{
vis[1]=1;
int v;
int w;
for(int i=h[1];~i;i=ne[i])
{
if(!vis[e[i].v])
{
qq.push(e[i]);
}
}
Eage tt;
for(int i=1;i<n;i++) //共找n-1条边
{
while(vis[qq.top().v])
{
qq.pop();
}
tt=qq.top(); //每次选出距离vis等于1图最近的一个顶点,即一条边
vis[tt.v]=1;
ans+=tt.len;
qq.pop();
v=tt.v;
for(int k=h[v];~k;k=ne[k]) //将其他顶点到该图的距离加入队列
{
if(!vis[e[k].v])
qq.push(e[k]);
}
}
}
int main()
{
cin>>n>>m;
init();
int u,v,w;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
prim();
cout<<ans;
return 0;
}