zoukankan      html  css  js  c++  java
  • 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 }



  • 相关阅读:
    Nginx进程信号管理
    Nginx配置缓存服务器
    访问Nginx显示目录
    kubeadm快速安装k8s
    《构建之法》读书笔记(一)
    Android Studio连接SQLite数据库与SQLite Studio实时同步的实现
    关于sqlite数据库与sqlite studio
    AS之去掉顶部标题栏
    今日学习
    AS之AlertDialog使用
  • 原文地址:https://www.cnblogs.com/yuecxl/p/2217104.html
Copyright © 2011-2022 走看看