比赛 |
20120704 |
评测结果 |
AWWWWWWWWT |
题目名称 |
危险游戏 |
最终得分 |
10 |
用户昵称 |
Citron酱 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2012-07-04 10:24:26 |
显示代码纯文本
#include <cstdio>
#define I_F "tubea.in"
#define O_F "tubea.out"
const int MAXn=10000;
const int MAXm=100000;
struct edge
{
int x, y, z;
unsigned long s;
bool f;
};
int n, m;
edge s[MAXm];
unsigned long tot;
int h1[MAXm+1], h2[MAXm+1];
void Input();
void Makeheap();
void Heapcpy();
template<typename Any>
inline void Swap(Any&, Any&);
void Heapdelete(int*, int&, const int&);
void Heapfixup(int*, const int&);
int Root(int*, const int&);
inline void Union(int*, const int&, const int&);
void Kruskal();
inline void Output();
int main()
{
int q, a;
unsigned long w;
Input();
Makeheap();
Heapcpy();
Kruskal();
Output();
for (scanf("%d",&q); q>0; --q)
{
scanf("%d%ld",&a,&w);
if (s[--a].f)
{
tot-=(s[a].s-w);
s[a].s=w;
if (s[a].s<s[h1[s[a].z/2]].s)
Heapfixup(h1,s[a].z);
}
else
{
s[a].s=w;
if (s[a].s<s[h1[s[a].z/2]].s)
Heapfixup(h1,s[a].z);
Heapcpy();
Kruskal();
}
Output();
}
return 0;
}
void Input()
{
freopen(I_F,"r",stdin);
scanf("%d%d",&n,&m);
for (int i=0; i<m; ++i)
{
scanf("%d%d%ld",&s[i].x,&s[i].y,&s[i].s);
s[i].f=false;
--s[i].x;
--s[i].y;
}
freopen(O_F,"w",stdout);
}
void Makeheap()
{
h1[1]=0;
s[0].z=1;
for (int i=1; i<m; ++i)
{
h1[i+1]=i;
s[i].z=i+1;
if (s[i].s<s[h1[(i+1)/2]].s)
Heapfixup(h1,i+1);
}
}
void Heapcpy()
{
for (int i=1; i<=m; ++i)
h2[i]=h1[i];
}
template<typename Any>
inline void Swap(Any &a, Any &b)
{
Any t=a;
a=b;
b=t;
}
void Heapdelete(int *h, int &l, const int &x)
{
h[x]=h[l--];
int i=x;
for (bool f=true; f; )
if (i*2>l)
f=false;
else
if (i*2==l)
if (s[h[i]].s>s[h[i*2]].s)
{
Swap(h[i],h[i*2]);
i=i*2;
}
else
f=false;
else
if (s[h[i*2]].s<s[h[i*2+1]].s)
if (s[h[i]].s>s[h[i*2]].s)
{
Swap(h[i],h[i*2]);
i=i*2;
}
else
f=false;
else
if (s[h[i]].s>s[h[i*2+1]].s)
{
Swap(h[i],h[i*2+1]);
i=i*2+1;
}
else
f=false;
}
void Heapfixup(int *h, const int &x)
{
for (int i=x; i>1 && s[h[i]].s<s[h[i/2]].s; i/=2)
{
s[h[i]].z=i/2;
s[h[i/2]].z=i;
Swap(h[i],h[i/2]);
}
}
int Root(int *c, const int &x)
{
if (c[x]!=x)
c[x]=Root(c,c[x]);
return c[x];
}
inline void Union(int *c, const int &x, const int &y)
{
c[y]=Root(c,x);
}
void Kruskal()
{
tot=0;
int c[MAXn];
int l=m;
for (int i=0; i<n; ++i)
c[i]=i;
for (int i=0; i<n-1; ++i)
{
while (Root(c,s[h2[1]].x)==Root(c,s[h2[1]].y))
Heapdelete(h2,l,1);
tot+=s[h2[1]].s;
Union(c,s[h2[1]].x,s[h2[1]].y);
Heapdelete(h2,l,1);
}
}
inline void Output()
{
printf("%ld\n",tot);
}