poj1904 King's Quest

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

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

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


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

ContractedBlock.gif ExpandedBlockStart.gif 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/archive/2011/10/18/2217104.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值