求助必关
查看原帖
求助必关
1241014
ruik楼主2024/12/21 11:21

全 wa,但能过样例。。。

求调,或给组 hack 也行。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100200;
int n,m,x,y,z,h[N],dis[N],cnt,ans;
bool mark[N];
struct node{
	int id,high;
};
bool operator <(const node &a,const node &b)
{
	if(a.high!=b.high)return a.high<b.high;
	return dis[a.id ]>dis[b.id ];
}
vector<node>g[N];
priority_queue<node>q;
void prim(){
	while(q.size()){
		node now=q.top();
		q.pop();
		int x=now.id,d=dis[x];
		if(mark[x])continue;
		mark[x]=true;
		ans+=d;
		cnt++;
		for(int i=0;i<g[x].size();i++){
			if(dis[g[x][i].id]>g[x][i].high){
				dis[g[x][i].id]=g[x][i].high;
				if(!mark[g[x][i].id])q.push((node){g[x][i].id,h[g[x][i].id]});
			}
		}
	}
}
signed main(){
	memset(dis,0x7f,sizeof(dis));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&h[i]);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&z);
		if(h[x]==h[y])continue;
		if(h[x]<h[y])swap(x,y);
		g[x].push_back((node){y,z});
	}dis[1]=0;
	q.push((node){1,h[1]});
	prim();
	printf("%lld %lld",cnt,ans);
	return 0;
} 
2024/12/21 11:21
加载中...