未加优化
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int INF=0x7fffffff/2;
int n,m,t,dis[5050],MST,min1,mp[5002][5002];
bool fl[5050];
int main()
{
int u,v,w,i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
mp[i][j]=INF;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(u!=v) mp[u][v]=mp[v][u]=min(mp[u][v],w);
}
for(i=1;i<=n;i++)
dis[i]=INF;
dis[1]=0;
for(i=1;i<=n;i++)
{
min1=INF*2;
for(j=1;j<=n;j++)
if(!fl[j]&&min1>dis[j])
{
min1=dis[j]; t=j;
}
fl[t]=true;
for(j=1;j<=n;j++)
if(!fl[j]&&mp[t][j]<dis[j])
dis[j]=mp[t][j];
}
for(i=1;i<=n;i++)
MST+=dis[i];
printf("%d",MST);
return 0;
}
优化后(采用堆和邻接表来优化以减少循环)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define re register
#define inl inline
#define LL long long
using namespace std;
const int MAXN=2e5+5;
typedef pair<int,int> pll;
priority_queue<pll,vector<pll>,greater<pll> >q;
int n,m;
int dis[MAXN],mst,cnt;
bool vis[MAXN];
int h[MAXN],nxt[2*MAXN],to[2*MAXN],len[2*MAXN],num_edge;
inl void add_edge(int x,int y,int z)
{
nxt[++num_edge]=h[x];
to[num_edge]=y;
len[num_edge]=z;
h[x]=num_edge;
}
int main()
{
int u,v,w;
scanf("%d%d",&n,&m);
for(re int i=1;i<=m;i++)
{
scanf("%d%d%d",&u,&v,&w);
add_edge(u,v,w);
add_edge(v,u,w);
}
memset(dis,0x7f,sizeof(dis));
dis[1]=0;
q.push(make_pair(dis[1],1));
while(!q.empty()&&cnt<n)
{
int k=q.top().second;
q.pop();
if(vis[k]) continue;
cnt++;
vis[k]=true;mst+=dis[k];
for(re int i=h[k];i;i=nxt[i])
{
if(!vis[to[i]]&&dis[to[i]]>len[i])
{
dis[to[i]]=len[i];
q.push(make_pair(dis[to[i]],to[i]));
}
}
}
if(cnt==n) printf("%d\n",mst);
else printf("orz\n");
return 0;
}