poj1904 King's Quest

这题时间太卡了,我不知为什么竟然跑了9000+ms 。

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

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


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

View Code
  1 #include"stdio.h"
2 #include"math.h"
3 #include"string.h"
4 #include"stdlib.h"
5 #define maxn 8005
6 typedef struct node
7 {
8 int girl;
9 int next;
10 }Node;
11
12 Node map[300009];
13
14 bool visit[maxn];
15 int ret, n, h[maxn], stack[maxn], top;
16 int low[maxn], dfn[maxn], edgecount, f[maxn];
17
18 void Insert(int from, int to)
19 {
20 map[ret].girl = to;
21 map[ret].next = h[from];
22 h[from] = ret++;
23 }
24
25 void Init()
26 {
27 int i, j, u, v, num;
28
29 ret = 1;
30 top = 0;
31 edgecount = 1;
32
33 for (i=1; i<=n; i++)
34 {
35 scanf("%d", &num);
36 for (j=1; j<=num; j++)
37 {
38 scanf("%d", &v);
39 Insert(i, v+n);
40 }
41 }
42
43 for (i=1; i<=n; i++)
44 {
45 scanf("%d", &v);
46 Insert(v+n, i);
47 }
48
49 return;
50 }
51
52 void Dfs(int now, int &deep)
53 {
54 int v, i;
55
56 stack[++top] = now;
57 dfn[now] = low[now] = deep++;
58 visit[now] = true;
59
60 for (i = h[now]; i!= 0; i = map[i].next)
61 {
62 v = map[i].girl;
63
64 if (dfn[v] == 0)
65 {
66 Dfs(v, deep);
67 if (low[now] > low[v]) low[now] = low[v];
68 }
69 else if (visit[v])
70 {
71 if (low[now] > low[v]) low[now] = low[v];
72 }
73 }
74
75 if (low[now] == dfn[now])
76 {
77 while (top>0 && now != stack[top])
78 {
79 f[stack[top]] = edgecount;
80 visit[stack[top]] = false;
81 top--;
82 }
83 f[now] = edgecount;
84 visit[now] = false;
85 top--;
86 edgecount++;
87 }
88 return;
89 }
90
91 int cmp(const void *a, const void *b)
92 {
93 return *((int *)a) > *((int *)b)? 1:-1;
94 }
95
96 void Funs()
97 {
98 int i, j, queue[maxn], maxcount, v, deep = 1;
99
100 for (i=1; i<=n; i++)
101 {
102 if (dfn[i] == 0) Dfs(i, deep);
103 }
104
105 for (i=1; i<=n; i++)
106 {
107 maxcount = 0;
108 for (j=h[i]; j!= 0; j = map[j].next)
109 {
110 v = map[j].girl;
111 if (f[i] == f[v])
112 {
113 maxcount++;
114 queue[maxcount] = v - n;
115 }
116 }
117 qsort(queue+1, maxcount, sizeof(queue[0]), cmp);
118 printf("%d ", maxcount);
119 for (j=1; j<maxcount; j++)printf("%d ", queue[j]);
120 printf("%d\n", queue[maxcount]);
121 }
122
123 return;
124 }
125
126 int main()
127 {
128 scanf("%d", &n);
129 Init();
130 Funs();
131 return 0;
132 }



原文地址:https://www.cnblogs.com/yuecxl/p/2217104.html