为什么 Kruskal 可以AC,Prim 不可以?
查看原帖
为什么 Kruskal 可以AC,Prim 不可以?
544446
Demon_master楼主2021/10/17 00:45

Prim(3TLE+1WA)

#include<bits/stdc++.h>
using namespace std;
const int maxn=2*1e5,maxm=5000*2+19;
int n,m;
struct P{
	int n,t,v;
}edge[maxn];

struct Q{
	int a;
	Q(){}
	Q(int b){a=b;}
};
bool operator<(const Q a,const Q b){
	return edge[a.a].v>edge[b.a].v;
}
int len=0;
int head[maxm];
bool vis[maxn];
int work(){
	priority_queue<Q> p;
	int ans=0;
	int cnt=0;
	p.push(Q(0));
	while(!p.empty()){
		int num=p.top().a;
		p.pop();
		if(vis[edge[num].t]) continue;
		vis[edge[num].t]=1;
		ans+=edge[num].v;
		cnt++;
		for(int i=head[edge[num].t];i;i=edge[i].n){
			if(vis[edge[i].t]) continue;
//			cout<<edge[num].t<<" "<<edge[i].t<<" "<<cnt<<" "<<ans<<endl;
			p.push(Q(i));
		}
	}
	if(cnt<n) return 0;
	return ans;
}



void build(int a,int b,int c){
	len++;
	edge[len].t=b;
	edge[len].v=c;
	edge[len].n=head[a];
	head[a]=len;
}

void read(){
	edge[0]={0,1,0};                             
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int f,t,v;
		scanf("%d%d%d",&f,&t,&v);
		build(f,t,v);
		build(t,f,v);
	}
	int ans=work();
	if(!ans) cout<<"ore";
	else cout<<ans;
}

int main(){
//	freopen("P3366_1.in","r",stdin);
	read();
}

Kruskal(AC)

#include<bits/stdc++.h>
using namespace std;
const int maxn=2*1e5;
int n,m;
struct P{
	int f,t,v;
}edge[maxn];
int fin[maxn],bian[maxn];
int C[maxn];

int Find(int a){
	return fin[a]==a ? a : fin[a]=Find(fin[a]);
}

void B(int a,int b){
	int A=Find(a),B=Find(b);
	if(C[A]<=C[B]) fin[A]=B;
	else fin[B]=A;
	if(C[A]==C[B]) C[B]++;
}


int Kruskal(){
	int ans=0,cnt=0;
	for(int i=1;i<=m;i++){
		int f=edge[bian[i]].f,t=edge[bian[i]].t;
		if(Find(f)==Find(t)) continue;
		cnt++;
		ans+=edge[bian[i]].v;
//		cout<<f<<" "<<t<<endl;
		B(t,f);
	}
//	cout<<ans<<" "<<cnt<<endl;
	if(cnt<n-1) ans=0;
	return ans;
}


bool cmp(int a,int b){
	return edge[a].v<edge[b].v;
}

void read(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++) fin[i]=i,C[i]=1;
	for(int i=1;i<=m;i++) scanf("%d%d%d",&edge[i].f,&edge[i].t,&edge[i].v);
	for(int i=1;i<=m;i++) bian[i]=i;
	sort(bian+1,bian+1+m,cmp);
//	for(int i=1;i<=m;i++) cout<<edge[bian[i]].v<<" ";
//	cout<<endl;
	int ans=Kruskal();
	if(ans) cout<<ans<<endl;
	else cout<<"orz"<<endl;
}

int main (){
	freopen("P3366_1.in","r",stdin);
	read();
}
2021/10/17 00:45
加载中...