救!克鲁斯卡尔40分,其他的点全WA
查看原帖
救!克鲁斯卡尔40分,其他的点全WA
716484
know_car_man楼主2024/7/11 11:25

代码如下


#include<bits/stdc++.h>
using namespace std;
long long n,a[101][101],vis[201],cnt,ans,temp,see;
struct node{
	long long Long;
	int A,B;
};
node b[101];
bool cmp(node x,node y){
	return x.Long<y.Long;
}
int main(){
	cin>>n;
	long long cnt=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
			if(a[i][j]!=0){
				b[++cnt].A=i;
				b[cnt].B=j;
				b[cnt].Long=a[i][j];	
			}
		}
	}
	sort(b+1,b+cnt+1,cmp);
	for(int j=1;j<=cnt;j++){
		if(vis[b[j].A]!=vis[b[j].B]||vis[b[j].A]==0||vis[b[j].B]==0){
			ans+=b[j].Long;
			temp++;
			if(vis[b[j].A]==0&&vis[b[j].B]==0){
				vis[b[j].A]=see++;
				vis[b[j].B]=vis[b[j].A];
			}
			else if(vis[b[j].A]==0){
				vis[b[j].A]=vis[b[j].B];
			}
			else if(vis[b[j].B]==0){
				vis[b[j].B]=vis[b[j].A];
			}
			else{
				for(int i=1;i<=n;i++){
					if(vis[i]==vis[b[j].B]){
						vis[i]=vis[b[j].A]; 
					}
				}
			}
		}
		if(temp==n){
			break;
		}
	}
	cout<<ans;
	return 0;
}

那位神?能大发慈悲帮帮本萌新,谢谢了!!!

2024/7/11 11:25
加载中...