比赛 20120704 评测结果 AAAAAAAAAT
题目名称 危险游戏 最终得分 90
用户昵称 QhelDIV 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-07-04 11:56:41
显示代码纯文本
#include <map>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("tubea.in");
ofstream fout("tubea.out");
long long N,T,Q;
class Node
{
public:
	long long length,from,to;
	Node *Xt;
}Map[100000],*last[100000];
class Info
{
public:
	long long from,to,Index;
};
multimap<long long,Info> M;
multimap<long long,Info>::iterator Pos[100002];
void Add(long long u,long long v,long long w)
{
	last[u]->Xt=new Node;
	last[u]->length=w;
	last[u]->to=v;
	last[u]->Xt=0;
}
class UFSd
{
public:
	long long Prev[20000];
	UFSd()
	{
	int i;
		for(i=1;i<=10000;i++)
			Prev[i]=i;
	}
	long long FR(int pos)
	{
		if(pos!=Prev[pos])
			Prev[pos]=FR(Prev[pos]);
		return Prev[pos];
	}
	void Union(int a,int b)
	{
	long long R1=FR(a),R2=FR(b);
		Prev[R2]=R1;
	}
	void Clear()
	{
	int i;
		for(i=1;i<=10000;i++)
			Prev[i]=i;}
}UFS;

void Initialize()
{
long long i,U,V,W;
	fin>>N>>T;
	for(i=1;i<=N;i++)
		last[i]=&Map[i];
	for(i=1;i<=T;i++)
	{
		fin>>U>>V>>W;
		Add(U,V,W);
		Add(V,U,W);
		Info temp;
		temp.from=U;temp.to=V;temp.Index=i;
		M.insert(pair<long long,Info>(W,temp));
	}
multimap<long long,Info>::iterator it,end=M.end();
	for(it=M.begin();it!=end;it++)
		Pos[it->second.Index]=it;
}

bool Cmp(Node a,Node b)
{
	return a.length>b.length;
}
void K()
{
long long Sum=0;
map<long long,Info>::iterator it,end=M.end();
	UFS.Clear();
	for(it=M.begin();it!=end;it++)
		if(UFS.FR(it->second.from)!=UFS.FR(it->second.to))
		{
			UFS.Union(it->second.from,it->second.to);
			Sum+=it->first;
		}
	fout<<Sum<<endl;
}

void Solve()
{
long long i,Ai,Wi;
	K();
	fin>>Q;
	for(i=1;i<=Q;i++)
	{
		fin>>Ai>>Wi;
		Info tmp=Pos[Ai]->second;
		M.erase(Pos[Ai]);
		Pos[Ai]=M.insert(pair<long long,Info>(Wi,tmp));
		K();
	}
}

int main()
{
	Initialize();
	
	Solve();
	
	fin.close();
	fout.close();
	return 0;
}