zoukankan      html  css  js  c++  java
  • POJ2594拐点弯的二分

      开始读题没理解题意,以为就是覆盖,可是怎么交都不对。。。 我就气愤了,结果去百度了一下发现奶奶的这题的机器人是可以隔点瞭望的,例如1->2->3、2->4、5->2  这个图  我现在5匹配2,2匹配4,那么1和3就剩下了,结果就是需要三个机器人。可是这与题意是相悖的,提议要求可一隔点向往,也就是说1能看到3,那么1和3也是可以匹配的,所以答案是2。(有向图的匹配和无向图的匹配是不一样的)

      那么接下来的任务就简单了,我把所有间接到达的点全部变成直接到达,让他自己去随便匹配好了,答案一定是对的。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<vector>
     5 #define maxn 510
     6 
     7 using namespace std;
     8 
     9 vector<int> g[maxn];
    10 int group[maxn][maxn];
    11 int link[maxn],vis[maxn];
    12 int n,m;
    13 
    14 int dfs(int x)
    15 {
    16     for(int i=0;i<g[x].size();i++)
    17     {
    18         int e=g[x][i];
    19         if(!vis[e])
    20         {
    21             vis[e]=1;
    22             if(link[e]==-1||dfs(link[e]))
    23             {
    24                 link[e]=x;
    25                 return true;
    26             }
    27         }
    28     }
    29     return false;
    30 }
    31 void floyd()
    32 {
    33       for(int i=1;i<=n;i++)
    34       {
    35           for(int j=1;j<=n;j++)
    36           {
    37              for(int k=1;k<=n;k++)
    38              {
    39                  if(group[k][i]&&group[i][j]&&j!=k) group[k][j]=1;
    40              }
    41           }
    42       }
    43 }
    44 void setup_map()
    45 {
    46     for(int i=1;i<=n;i++)
    47     {
    48         for(int j=1;j<=n;j++)
    49         {
    50             if(group[i][j])
    51                 g[i].push_back(j);
    52         }
    53     }
    54 }
    55 int main()
    56 {
    57     while(scanf("%d%d",&n,&m)!=EOF)
    58     {
    59         if(n==0&&m==0) break;
    60         for(int i=1;i<=n;i++)
    61             g[i].clear();
    62         memset(group,0,sizeof(group));
    63         for(int j=1;j<=m;j++)
    64         {
    65             int a,b;
    66             scanf("%d%d",&a,&b);
    67             group[a][b]=1;
    68         }
    69         floyd();
    70         setup_map();
    71         memset(link,-1,sizeof(link));
    72         int sum=0;
    73         for(int q=1;q<=n;q++)
    74         {
    75             memset(vis,0,sizeof(vis));
    76             if(dfs(q)) sum++;
    77         }
    78         printf("%d
    ",n-sum);
    79     }
    80     return 0;
    81 }
    View Code
  • 相关阅读:
    Java数据持久层
    一张图解决ThreadLocal
    类加载器及其加载原理
    手写LRU缓存淘汰算法
    使用归并排序思想解决逆序对数量问题
    Same Origin Policy 浏览器同源策略详解
    如何估算线程池的线程数?
    分布式锁为什么要选择Zookeeper而不是Redis?
    SpringBoot的SpringMVC使用FastJson依赖时LocalDateTime全局配置序列化格式
    数据库中的枚举值如何存储
  • 原文地址:https://www.cnblogs.com/liboyan/p/4432580.html
Copyright © 2011-2022 走看看