所以貌似这道题O2能过,不过是卡过的(n遍kruskal)
  • 板块P1340 兽径管理
  • 楼主I_m_FW
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/11/2 21:31
  • 上次更新2023/11/4 01:32:48
查看原帖
所以貌似这道题O2能过,不过是卡过的(n遍kruskal)
445896
I_m_FW楼主2021/11/2 21:31
#include <bits/stdc++.h>
using namespace std;
const int N=210,M=12010;
int h[M],to[M],w[M],ne[M],tot;
int n,t,f[M],ans;
int st[N][N],p;
void add(int x,int y,int z){
	to[++tot]=y;ne[tot]=h[x];h[x]=tot;w[tot]=z;
}
struct node{
	int x,y,w;
}a[M];
bool operator<(node xx,node yy){
	return xx.w<yy.w;
}
int get(int a){
	if(f[a]==a)return a;
	return f[a]=get(f[a]);
}
int main(){
	memset(st,0x3f,sizeof st);
	scanf("%d%d",&n,&t);
	int answ=-1;
	for(int i=1;i<=t;i++){
		int ans=0,res=1;
		int xx,yy,ww;
		scanf("%d%d%d",&xx,&yy,&ww);
		if(st[xx][yy]>ww&&st[yy][xx]>ww){
			st[xx][yy]=ww;st[yy][xx]=ww;
			p++;
			a[p].x=xx;a[p].y=yy;a[p].w=ww;
		}
		else {
			printf("%d\n",answ);continue;
		}
		if(i<n-1){
			printf("%d\n",-1);continue;
		}
		for(int k=1;k<=n;k++)f[k]=k;
		sort(a+1,a+1+p);
		for(int j=1;j<=p;j++){
			if(res==n)break;
			int x=get(a[j].x),y=get(a[j].y),e=a[j].w;
			if(x==y)continue;
			ans+=e;
			f[y]=x;
			res++;
		}
		if(res<n)printf("%d\n",-1);
		else {
			printf("%d\n",ans);answ=ans;
		}
	}return 0;
}```
2021/11/2 21:31
加载中...