RE求debug
查看原帖
RE求debug
473936
Tommy_li楼主2022/7/27 10:26

rt

/*****************************************
Note  :
******************************************/
#include <queue>
#include <math.h>
#include <stack>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <iomanip>
#include <string.h>
#include <algorithm>
#define LL long long
#define IL inline
const int N = 2e6+10;
const int INF = 0x3f3f3f3f;
using namespace std;
IL int read()
{
    char ch = getchar();
    int f = 1, num = 0;
    while(ch>'9'||ch<'0')
    {
        if(ch=='-') f = -1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
        num = num*10+ch-'0', ch = getchar();
    return num*f;
}
int tot,n,m,h[N],vis[N],cnt,ans,fa[N],sum;
int head[N],ne[N],w[N],to[N],id;
void add(int x,int y,int z)
{
	to[++id]=y,w[id]=z,ne[id]=head[x],head[x]=id;
}
struct node
{
	int u,v,w;
}p[N];
void bfs(int u)
{
	queue<int> q;
	q.push(u),vis[u]=1;
	while(!q.empty())
	{
		int t=q.front();
		sum++;
		q.pop();
		for(int i = head[t];i;i=ne[i])
		{
			int v=to[i];
			p[++cnt]=(node){t,v,w[i]};
			if(!vis[v])
			{
				vis[v]=1;
				q.push(v);
			}
		}
	}
}
bool cmp(node a,node b)
{
	if(h[a.u]==h[a.v])
		return a.w<b.w;
	return h[a.u]>h[a.v];
}
int f(int x)
{
	if(fa[x]==x) return x;
	return fa[x]=f(fa[x]);
}
int main()
{
	n=read(),m=read();
	for(int i = 1;i<=n;i++)
		h[i]=read(),fa[i]=i;
	for(int i = 1,x,y,z;i<=m;i++)
	{
		x=read(),y=read(),z=read();
		if(h[x]>=h[y])
			add(x,y,z);
		if(h[y]>=h[x])
			add(y,x,z);
	}
	bfs(1);
	sort(p+1,p+1+cnt,cmp);
	for(int i = 1;i<=cnt;i++) 
	{
		int uu=f(p[i].u),vv=f(p[i].v);
		if(uu!=vv)
		{
			fa[uu]=vv;
			ans+=p[i].w;
		}
	}
	printf("%d %d\n",sum,ans);
}


2022/7/27 10:26
加载中...