QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#540249#8941. Even or Odd Spanning Treeucup-team4717#WA 0ms11936kbC++142.3kb2024-08-31 16:43:202024-08-31 16:43:20

Judging History

你现在查看的是最新测评结果

  • [2024-08-31 16:43:20]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:11936kb
  • [2024-08-31 16:43:20]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-48,ch=getchar();}
	return x*f;
}
int T,n,m;

struct Node{
	int u,v,w;
}e[N];

int t[N],val[N],f[N],sz[N],cnt,sum,idt;
inline int Find(int x){
	return x==f[x]?x:Find(f[x]);
}

bool cmp(Node a,Node b){
	return a.w<b.w;
}

void merge(int x,int y,int w){
	if(sz[x]<sz[y]) t[x]=++idt,val[x]=w,f[x]=y,sz[y]+=sz[x];
	else t[y]=++idt,val[y]=w,f[y]=x,sz[x]+=sz[y];
	cnt++;
	sum+=w;
}

bool vis1[N];
void jump1(int x,int y){
	vis1[x]=1;
	if(x==y) return;
	jump1(f[x],y);
}

bool vis2[N];
void jump2(int x,int y){
	vis2[x]=1;
	if(x==y) return;
	jump2(f[x],y);
}

void rejump1(int x,int y){
	vis1[x]=0;
	if(x==y) return;
	rejump1(f[x],y);
}

void rejump2(int x,int y){
	vis2[x]=0;
	if(x==y) return;
	rejump2(f[x],y);
}


int mn,wdf,sb;
bool flg=0;

void check(int x,int y){
	if(x==y) return;
	if(vis1[x]&&vis2[x]) return;
	// if(t[x]>mn) mn=t[x],wdf=val[x];
	if((val[x]&1)^(sb&1)) mn=max(mn,val[x]),flg=1;
	check(f[x],y);
}

signed main(){	
	// freopen("j.in","r",stdin);
	// freopen("test.out","w",stdout);
	T=read();
	while(T--){
		n=read(),m=read(),cnt=sum=idt=0;
		for(int i=1;i<=m;i++){
			e[i].u=read();
			e[i].v=read();
			e[i].w=read();
		}
		sort(e+1,e+1+m,cmp);
		for(int i=1;i<=n;i++) f[i]=i,sz[i]=1;
		for(int i=1;i<=m;i++){
			int x=Find(e[i].u),y=Find(e[i].v);
			if(x==y) continue;
			merge(x,y,e[i].w);
		}			
		cout<<cnt<<"\n";
		if(cnt<n-1){
			printf("-1 -1\n");
			for(int i=1;i<=n;i++) t[i]=val[i]=0;
			continue;
		}
		int ans1=sum,ans2=1e16;
		idt=0;
		for(int i=1;i<=n;i++) f[i]=i,sz[i]=1,t[i]=0,val[i]=0;
		for(int i=1;i<=m;i++){
			int x=Find(e[i].u),y=Find(e[i].v);
			if(x==y){
				mn=0;
				jump1(e[i].u,x);
				jump2(e[i].v,y);
				sb=e[i].w,flg=0;
				check(e[i].u,x);
				check(e[i].v,y);
				rejump1(e[i].u,x);
				rejump2(e[i].v,y);

				if(flg) ans2=min(ans2,ans1-mn+e[i].w);
				continue;
			}
			merge(x,y,e[i].w);		
		}
		if(ans2==1e16) ans2=-1;
		if(ans1&1) swap(ans1,ans2);
		printf("%lld %lld\n",ans1,ans2);
		for(int i=1;i<=n;i++) t[i]=val[i]=0;
	}
	return 0;
}
/*
1
3 4
2 1 5
2 1 0
3 1 2
2 3 9
*/

詳細信息

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 11936kb

input:

3
2 1
1 2 5
3 1
1 3 1
4 4
1 2 1
1 3 1
1 4 1
2 4 2

output:

1
-1 5
1
-1 -1
3
4 3

result:

wrong answer 1st numbers differ - expected: '-1', found: '1'