42求调 (听取wa一片)
查看原帖
42求调 (听取wa一片)
601142
hnoi楼主2023/5/7 10:41
#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");
} 

评测记录

2023/5/7 10:41
加载中...