记录编号 58237 评测结果 AAAAAAAAAA
题目名称 威尼斯旅行 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 2.892 s
提交时间 2013-04-18 18:34:06 内存使用 6.05 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<deque>
#include<algorithm>
using namespace std;
const int SIZEN=100001,SIZEM=200001,SIZEQ=200001;
int n,m,q;
long long k;
class SIDE{
public:
	int x,y;//端点
	long long w;//权值
}c[SIZEM];
bool operator < (SIDE a,SIDE b){
	return a.w<b.w;
}
int father[SIZEN]={0};
long long size[SIZEN]={0};
int tot=1;
void clear(void){
	int i;
	for(i=1;i<=n;i++) father[i]=-1,size[i]=1;
}
int grand(int x){
	if(father[x]==-1) return x;
	else{
		father[x]=grand(father[x]);
		return father[x];
	}
}
void merger(int a,int b){
	if(size[a]<size[b]){
		father[a]=b;
		size[b]+=size[a],size[a]=0;
	}
	else{
		father[b]=a;
		size[a]+=size[b],size[b]=0;
	}
}
#define now c[tot]
long long ans[SIZEQ]={0};
int reque[SIZEQ]={0};
int lis[SIZEQ]={0};
long long nowans=0;
bool cmp(int a,int b){
	return reque[a]<reque[b];
}
void deal(int s){
	int temp1,temp2;
	while(tot<=m&&now.w<=reque[s]){
		temp1=grand(now.x),temp2=grand(now.y);
		if(temp1!=temp2){
			nowans+=(size[temp1]*size[temp2]);
			merger(temp1,temp2);
		}
		tot++;
	}
	ans[s]=nowans;
}
void work(void){
	scanf("%d%d%d",&n,&m,&q);
	int i;
	int x,y,w;
	for(i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&w);
		c[i].x=x,c[i].y=y,c[i].w=w;
	}
	sort(c+1,c+1+m);
	tot=1;
	clear();
	for(i=1;i<=q;i++){
		lis[i]=i;
		scanf("%d",&reque[i]);
	}
	sort(lis+1,lis+1+q,cmp);
	for(i=1;i<=q;i++){
		deal(lis[i]);
	}
	for(i=1;i<=q;i++) cout<<ans[i]<<endl;
}
int main(){
	freopen("tripa.in","r",stdin);
	freopen("tripa.out","w",stdout);
	work();
	return 0;
}