您的位置:首页 > 产品设计 > UI/UE

poj1904 King's Quest

2011-10-18 23:45 295 查看
这题时间太卡了,我不知为什么竟然跑了9000+ms 。

这题刚看时很容易想到二分图,但是仔细一看,他已经给你完备匹配了,所以思路应该往别的方面去想。

他要解决的是最多可能与哪几个人中的一个结婚。有的虽然你有意向,但是她已经是别人的了,就不能纳入你想结婚的人选行列。

他给了你完备匹配,也就是说,不管怎样这个人肯定是你的喜欢人选。如果把这个姑娘和你连边,那么就在你和这个姑娘之间存在回路(是联通的)了。既然存在回路可以是想结婚中的人选。那么推广到整个图,也是一样的道理。所以这题要你解决的是联通性问题。

View Code

#include"stdio.h"
#include"math.h"
#include"string.h"
#include"stdlib.h"
#define maxn 8005
typedef struct node
{
int girl;
int next;
}Node;

Node map[300009];

bool visit[maxn];
int ret, n, h[maxn], stack[maxn], top;
int low[maxn], dfn[maxn], edgecount, f[maxn];

void Insert(int from, int to)
{
map[ret].girl = to;
map[ret].next = h[from];
h[from] = ret++;
}

void Init()
{
int i, j, u, v, num;

ret = 1;
top = 0;
edgecount = 1;

for (i=1; i<=n; i++)
{
scanf("%d", &num);
for (j=1; j<=num; j++)
{
scanf("%d", &v);
Insert(i, v+n);
}
}

for (i=1; i<=n; i++)
{
scanf("%d", &v);
Insert(v+n, i);
}

return;
}

void Dfs(int now, int &deep)
{
int v, i;

stack[++top] = now;
dfn[now] = low[now] = deep++;
visit[now] = true;

for (i = h[now]; i!= 0; i = map[i].next)
{
v = map[i].girl;

if (dfn[v] == 0)
{
Dfs(v, deep);
if (low[now] > low[v]) low[now] = low[v];
}
else if (visit[v])
{
if (low[now] > low[v]) low[now] = low[v];
}
}

if (low[now] == dfn[now])
{
while (top>0 && now != stack[top])
{
f[stack[top]] = edgecount;
visit[stack[top]] = false;
top--;
}
f[now] = edgecount;
visit[now] = false;
top--;
edgecount++;
}
return;
}

int cmp(const void *a, const void *b)
{
return *((int *)a) > *((int *)b)? 1:-1;
}

void Funs()
{
int i, j, queue[maxn], maxcount, v, deep = 1;

for (i=1; i<=n; i++)
{
if (dfn[i] == 0) Dfs(i, deep);
}

for (i=1; i<=n; i++)
{
maxcount = 0;
for (j=h[i]; j!= 0; j = map[j].next)
{
v = map[j].girl;
if (f[i] == f[v])
{
maxcount++;
queue[maxcount] = v - n;
}
}
qsort(queue+1, maxcount, sizeof(queue[0]), cmp);
printf("%d ", maxcount);
for (j=1; j<maxcount; j++)printf("%d ", queue[j]);
printf("%d\n", queue[maxcount]);
}

return;
}

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