hnoi @ 2023-05-07 10:41:26
#include<bits/stdc++.h>
using namespace std;
const int inf=INT_MAX;
struct node {//将每个点出发的所有边以链表存下
int v,w,next;//next表示与这个边起点相同的上一条边的编号
}e[5005<<1];
int head[5005],dis[5005],cnt,n,m,tot,num=0,mst;
bool vis[5005];
void add(int u,int v,int w){//u为起点
e[++cnt].v=v;//终点
e[cnt].w=w;//权值
e[cnt].next=head[u];//更新以u为起点上一条边的编号
head[u]=cnt;//更新以u开头的最后一条边的编号
}
int prim(){
int now=1;
for(int i=2;i<=n;i++){
dis[i]=inf;
}
for(int i=head[1];i!=0;i=e[i].next){//遍历以i为起点的边(从一顶点开始)
dis[e[i].v]=min(e[i].w,dis[e[i].v]);
}
while(num<n-1){
int minn=inf;
vis[now]=1;
for(int i=1;i<=n;i++){
if(minn>dis[i]&&!vis[i]){
minn=dis[i];
now=i;
}
}
mst+=minn;
num++;
for(int i=head[now];i!=0;i=e[i].next){
if(dis[e[i].v]>e[i].w&&!vis[e[i].v]) dis[e[i].v]=e[i].w;
}
}
return mst;
}
int main(){
cin>>n>>m;
int u,v,w;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
if(cnt/2==m)
printf("%d",prim());
else printf("orz");
}
评测记录
by bamboo12345 @ 2023-05-07 10:45:04
@CHYYDS 首先数组开小了,其次你这判orz跟没判一样
by __er @ 2023-05-07 11:19:47
@CHYYDS orz
判的什么玩意
by hnoi @ 2023-05-07 11:28:26
@bamboo123 大佬这个orz应该怎么判断啊(菜鸡提问)
by bamboo12345 @ 2023-05-07 11:40:25
@CHYYDS 你prim的时候如果当前最小也是 inf 那就是orz啊