标签:
用STL的vector容器写,直接内部排序了。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define PI acos(-1.0)
#define M 1000005 //10^6
#define eps 1e-8
#define LL long long
#define moo 1000000007
#define INF 9999999999
using namespace std;
#define maxm 100000+500
#define maxn 100000+500
struct Edge
{
int u,v,w;
bool operator <(const Edge &rhs) const
{
return w<rhs.w;
}
void read()
{
scanf("%d %d %d",&u,&v,&w);
}
}edge[maxm];
vector<Edge> res;
int fa[maxm];
int findfa(int x)
{
if(x==fa[x])
return x;
return fa[x]=findfa(fa[x]);
}
bool same(int a,int b)
{
return findfa(a)==findfa(b);
}
void merge(int a,int b)
{
int xx=findfa(a);
int yy=findfa(b);
if(xx>yy)
fa[xx]=yy;
else
fa[yy]=xx;
}
int kruscal(vector<Edge> &e,int n)
{
for(int i=1;i<=n;i++)
fa[i]=i;
vector<Edge>res;
sort(e.begin(),e.end());
int ans=0;
for(int i=0;i<e.size();i++)
{
if(same(e[i].u,e[i].v))
continue;
merge(e[i].u,e[i].v);
ans+=e[i].w;
res.push_back(e[i]);
}
e=res;
return ans;
}
int main()
{
int m,n,q;
while(~scanf("%d %d %d",&n,&m,&q))
{
for(int i=0;i<m;i++)
edge[i].read();
edge[m++].read();
sort(edge,edge+m);
res.clear();
for(int i=1;i<=n;i++)
fa[i]=i;
int ans=0;
for(int i=0;i<m;i++)
{
if(same(edge[i].u,edge[i].v))
continue;
merge(edge[i].u,edge[i].v);
ans+=edge[i].w;
res.push_back(edge[i]);
}
q--;
printf("%d\n",ans);
while(q--)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
res.push_back((Edge){u,v,w});
printf("%d\n",kruscal(res,n));
}
}
return 0;
}
第四届华中区程序设计邀请赛暨武汉大学第十三届校赛 网络预选赛 Problem 1566 - C - Spanning Tree
标签:
原文地址:http://blog.csdn.net/wust_zjx/article/details/45177229