您的位置:首页 > 其它

【HDU】3498 whosyourdaddy

2012-07-26 09:59 363 查看
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 10000
#define MAXM 60
#define INF 0x7FFFFFFF
using namespace std;
bool G[MAXM][MAXM];
int R[MAXN], L[MAXN], U[MAXN], D[MAXN];
int size, ans, C[MAXN], S[MAXN], H[MAXN];
bool vis[MAXM];
void Init(int n)
{
int i;
memset(G, false, sizeof(G));
for (i = 0; i <= n; i++)
{
R[i] = i + 1;
L[i + 1] = i;
U[i] = D[i] = i;
S[i] = 0;
H[i] = -1;
}
R
= 0;
size = n + 1;
}
void Link(int r, int c)
{
U[size] = c;
D[size] = D[c];
U[D[c]] = size;
D[c] = size;
if (H[r] < 0)
H[r] = L[size] = R[size] = size;
else
{
L[size] = H[r];
R[size] = R[H[r]];
L[R[H[r]]] = size;
R[H[r]] = size;
}
S[c]++;
C[size++] = c;
}
void Remove(int c)
{
int i;
for (i = D[c]; i != c; i = D[i])
{
L[R[i]] = L[i];
R[L[i]] = R[i];
}
}
void Resume(int c)
{
int i;
for (i = D[c]; i != c; i = D[i])
L[R[i]] = R[L[i]] = i;
}
int A()
{
int i, j, k, res;
memset(vis, false, sizeof(vis));
for (res = 0, i = R[0]; i; i = R[i])
{
if (!vis[i])
{
res++;
for (j = D[i]; j != i; j = D[j])
{
for (k = R[j]; k != j; k = R[k])
vis[C[k]] = true;
}
}
}
return res;
}
void Dance(int now)
{
if (R[0] == 0)
ans = min(ans, now);
else if (now + A() < ans)
{
int i, j, temp, c;
for (temp = INF,i = R[0]; i; i = R[i])
{
if (temp > S[i])
{
temp = S[i];
c = i;
}
}
for (i = D[c]; i != c; i = D[i])
{
Remove(i);
for (j = R[i]; j != i; j = R[j])
Remove(j);
Dance(now + 1);
for (j = L[i]; j != i; j = L[j])
Resume(j);
Resume(i);
}
}
}
int main()
{
int n, m, u, v, i, j;
while (~scanf("%d%d", &n, &m))
{
Init(n);
while (m--)
{
scanf("%d%d", &u, &v);
G[u][v] = G[v][u] = true;
}
for (i = 1; i <= n; i++)
{
G[i][i] = true;
for (j = 1; j <= n; j++)
{
if (G[i][j])
Link(i, j);
}
}
ans = INF;
Dance(0);
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: