#include <iostream>
using namespace std;
const int MAXN=5010;
const int INF=0x3f3f3f3f;
int g[MAXN][MAXN],dist[MAXN];
bool book[MAXN];
int n,m,res;
void prim()
{
dist[1]=0;
book[1]=true;
for(int i=2;i<=n;i++)
dist[i]=min(dist[i],g[1][i]);
for(int i=2;i<=n;i++)
{
int temp=INF;
int t=-1;
for(int j=2;j<=n;j++)
{
if(!book[j]&&dist[j]<temp)
{
temp=dist[j];
t=j;
}
}
if(t==-1)
{
res=INF;
return;
}
book[t]=true;
res+=dist[t];
for(int j=2;j<=n;j++)
dist[j]=min(dist[j],g[t][j]);
}
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
g[i][j]=INF;
dist[i]=INF;
}
for(int i=1;i<=m;i++)
{
int u,v,w;
cin>>u>>v>>w;
g[u][v]=g[v][u]=w;
}
prim();
if(res==INF)
cout<<"orz";
else cout<<res;
return 0;
}
prim对了仨点
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN=5010,MAXM=200010;
struct edge{
int u,v,w;
}edges[MAXM];
int n,m,u,v,w,parent[MAXN];
void Ufset()
{
for(int i=1;i<=n;i++)
parent[i]=-1;
}
bool cmp(edge o,edge p)
{
return o.w<=p.w;
}
int Find(int x)
{
int s;
for(s=x;parent[s]>0;s=parent[s]);
//优化-压缩路径
while(s!=x)
{
int tmp=parent[x];
parent[x]=s;
x=tmp;
}
return s;
}
void Union(int R1,int R2)
{
int r1=Find(R1),r2=Find(R2);
if(r1>r2)
parent[R1]=r2;
if(r1<r2)
parent[R2]=r1;
/*
int tmp=parent[r1]+parent[r2];
if(parent[r1]>parent[r2])
{
parent[r1]=r2;
parent[r2]=tmp;
}
else {
parent[r2]=r1;
parent[r1]=tmp;
}
*/
}
void kruskal()
{
int sum=0,num=0;
for(int i=1;i<=m;i++)
{
if(Find(edges[i].u)!=Find(edges[i].v))//||Find(parent[edges[i].u])==-1
{
sum+=edges[i].w;
num++;
Union(edges[i].u,edges[i].v);
}
if(num>=n-1) break;
}
if(num<n-1) cout<<"orz";
else cout<<sum;
}
int main() {
cin>>n>>m;
//n dian m bian
Ufset();
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
edges[i].u=u;
edges[i].v=v;
edges[i].w=w;
}
sort(edges+1,edges+m+1,cmp);
kruskal();
return 0;
//O(边数*log边数)
}
44分,还RE了几个
我太弱了