您的位置:首页 > 其它

HDU 3038 How Many Answers Are Wrong 并查集带权路径压缩

2013-07-19 22:39 531 查看
思路跟 LA 6187 完全一样。

我是乍一看没反应过来这是个并查集,知道之后就好做了。

d[i]代表节点 i 到根节点的距离,即每次的sum。

#include <cstdio>
#include <cstring>
#include <cstdlib>

const int MAXN = 200010;

int N, Q;
int p[MAXN];
int d[MAXN];

int FindSet( int x )
{
if ( p[x] == x ) return x;
int root = FindSet( p[x] );
d[x] += d[ p[x] ];
return p[x] = root;
}

int main()
{
while ( ~scanf( "%d%d", &N, &Q ) )
{
for ( int i = 0; i <= N; ++i )
{
d[i] = 0;
p[i] = i;
}

int cnt = 0;
while ( Q-- )
{
int a, b, sum;
scanf( "%d%d%d", &a, &b, &sum );
--a;
int u = FindSet( a );
int v = FindSet( b );
if ( u == v )
{
if ( sum != d[b] - d[a] )
++cnt;
}
else
{
p[v] = u;
d[v] = d[a] - d[b] + sum;
}
}

printf( "%d\n", cnt );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: