比赛中没什么想法,理解成有2张hash表了.后来看了小波的解题报告,题目转换成求联通分枝,并判断每个联通分枝的结点数是否小于等于变数,不是的话就不能正常hash了.判断联通的时候用了并查集.
#include
<
iostream
>
#include
<
string
>
#include
<
vector
>
using
namespace
std;
#define
MAX 10001
typedef
struct
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int num_dge; //该点连接到的边的数量
int par; //父结点
int sum_dge; //该点为父结点时的边的条数
int num_node; //改点为父结点时的点数
}
Node;
Node a[MAX];
int
m, n;
int
b[MAX][
2
];
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
int
find(
int
x)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(a[x].par == x)
return x;
int t = x;
while (a[t].par != t)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
t = a[t].par;
}
int tt;
while (x != t)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
tt = a[x].par;
a[x].par= t;
x = tt;
}
return t;
}
void
unit(
int
x,
int
y)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if(a[x].num_node >= a[y].num_node)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
a[x].num_node += a[y].num_node, a[y].par = x;
a[x].sum_dge += a[y].sum_dge;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
a[y].num_node += a[x].num_node, a[x].par = y;
a[y].sum_dge += a[x].sum_dge;
}
}
int
main()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
int t;
int i, j, k;
cin >> t;
while (t--)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cin >> m >> n;
for (i=0; i<n; ++i)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
a[i].par = i;
a[i].num_dge = 0;
a[i].num_node = 1;
a[i].sum_dge = 0;
}
int s, e;
for (i=0; i<m; ++i)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
cin >> b[i][0] >> b[i][1];
a[b[i][0]].num_dge++;
a[b[i][1]].num_dge++;
}
for (i=0; i<n; ++i)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
a[i].sum_dge = a[i].num_dge;
}
for (i=0; i<m; ++i)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
s = b[i][0], e = b[i][1];
int n1 = find(s);
int n2 = find(e);
if(n1 != n2)
unit(n1, n2);
}
for (i=0; i<n; ++i)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(a[i].par == i && a[i].num_node > 1)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if(a[i].num_node < a[i].sum_dge/2)
break;
}
}
if(i>=n)
cout << "successful hashing" << endl;
else
cout << "rehash necessary" << endl;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
}
return 0;
}