• 二分图最小覆盖


    hdu1150 

    最小顶点覆盖

    hdu1498 50 years, 50 colors

    最小顶点覆盖 +枚举

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 #include<cmath>
     8 #include<queue>
     9 #include<set>
    10 using namespace std;
    11 #define N 105
    12 #define LL long long
    13 #define INF 0xfffffff
    14 const double eps = 1e-8;
    15 const double pi = acos(-1.0);
    16 const double inf = ~0u>>2;
    17 vector<int>ed[N];
    18 struct node
    19 {
    20     int x,y;
    21 };
    22 vector<node>pa[N];
    23 bool vis[2*N],f[N];
    24 int mat[N<<1],o[N],co[N];
    25 int dfs(int u)
    26 {
    27     int i;
    28     for(i = 0 ;i < ed[u].size() ; i++)
    29     {
    30         int v = ed[u][i];
    31         if(vis[v]) continue;
    32         vis[v] = 1;
    33         if(mat[v]==-1||dfs(mat[v]))
    34         {
    35             mat[v] = u;
    36             return 1;
    37         }
    38     }
    39     return 0;
    40 }
    41 int main()
    42 {
    43     int n,k,i,j;
    44     while(scanf("%d%d",&n,&k)&&n&&k)
    45     {
    46         memset(f,0,sizeof(f));
    47         for(i = 1; i <=100 ;i++)
    48         pa[i].clear();
    49         int m = 0 ;
    50         for(i = 1; i <= n ;i++)
    51             for(j = 1 ;j <= n ;j++)
    52             {
    53                 int x;
    54                 node a;
    55                 a.x = i;a.y = j;
    56                 scanf("%d",&x);
    57                 if(!f[x])
    58                 {
    59                     f[x] = 1;
    60                     m++;
    61                     co[m] = x;
    62                 }
    63                 pa[x].push_back(a);
    64             }
    65         int g = 0;
    66         for(i = 1; i <= m; i++)
    67         {
    68             memset(mat,-1,sizeof(mat));
    69             int c = co[i];
    70             for(j = 1; j <= n; j++)
    71             ed[j].clear();
    72             for(j = 0 ;j < pa[c].size() ; j++)
    73             {
    74                 node a = pa[c][j];
    75                 ed[a.x].push_back(a.y+n);
    76             }
    77             int cnt = 0;
    78             for(j = 1; j <= n ;j++)
    79             {
    80                 memset(vis,0,sizeof(vis));
    81                 if(dfs(j))
    82                 cnt++;
    83             }
    84             if(cnt>k)
    85             o[++g] = c;
    86         }
    87         if(g==0)
    88         {
    89             puts("-1");
    90             continue;
    91         }
    92         sort(o+1,o+g+1);
    93         for(i =1 ;i < g ; i++)
    94         cout<<o[i]<<" ";
    95         cout<<o[i]<<endl;
    96     }
    97     return 0;
    98 }
    View Code

    hdu2119  

    最小顶点覆盖 裸

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 #include<cmath>
     8 #include<queue>
     9 #include<set>
    10 using namespace std;
    11 #define N 110
    12 #define LL long long
    13 #define INF 0xfffffff
    14 const double eps = 1e-8;
    15 const double pi = acos(-1.0);
    16 const double inf = ~0u>>2;
    17 vector<int>ed[N];
    18 bool vis[N<<1];
    19 int mat[N<<1];
    20 int dfs(int u)
    21 {
    22     int i;
    23     for(i = 0 ;i < ed[u].size();  i++)
    24     {
    25         int v = ed[u][i];
    26         if(vis[v]) continue;
    27         vis[v] = 1;
    28         if(mat[v]==-1||dfs(mat[v]))
    29         {
    30             mat[v] = u;
    31             return 1;
    32         }
    33     }
    34     return 0;
    35 }
    36 
    37 int main()
    38 {
    39     int n,i,j,m;
    40     while(cin>>n)
    41     {
    42         if(!n) break;
    43         cin>>m;
    44         memset(mat,-1,sizeof(mat));
    45         for(i = 1 ;i <=  n;i++)
    46         ed[i].clear();
    47         for(i = 1 ;i <= n ;i++)
    48             for(j = 1 ;j <= m ;j++)
    49             {
    50                 int x;
    51                 cin>>x;
    52                 if(x)
    53                 ed[i].push_back(j+n);
    54             }
    55         int ans = 0;
    56         for(i = 1 ;i <= n;i++)
    57         {
    58             memset(vis,0,sizeof(vis));
    59             if(dfs(i))
    60             ans++;
    61         }
    62         cout<<ans<<endl;
    63     }
    64     return 0;
    65 }
    View Code

    hdu1054  Strategic Game

    最小顶点覆盖 不确定左右子集 建双向边 答案/2

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 #include<cmath>
     8 #include<queue>
     9 #include<set>
    10 using namespace std;
    11 #define N 1510
    12 #define LL long long
    13 #define INF 0xfffffff
    14 const double eps = 1e-8;
    15 const double pi = acos(-1.0);
    16 const double inf = ~0u>>2;
    17 int mat[N];
    18 bool vis[N];
    19 vector<int>ed[N];
    20 int dfs(int u)
    21 {
    22     int i;
    23     for(i = 0; i < ed[u].size(); i++)
    24     {
    25         int v = ed[u][i];
    26         if(vis[v]) continue;
    27         vis[v] = 1;
    28         if(mat[v]==-1||dfs(mat[v]))
    29         {
    30             mat[v] = u;
    31             return 1;
    32         }
    33     }
    34     return 0;
    35 }
    36 int main()
    37 {
    38     int n,i;
    39     while(scanf("%d",&n)!=EOF)
    40     {
    41         memset(mat,-1,sizeof(mat));
    42         memset(vis,0,sizeof(vis));
    43         for(i = 0 ; i < n; i++)
    44         ed[i].clear();
    45         for(i = 0 ; i < n ;i++)
    46         {
    47             int u,v,k;
    48             scanf("%d%*c%*c%d%*c",&u,&k);
    49             while(k--)
    50             {
    51                 scanf("%d",&v);
    52                 ed[u].push_back(v);
    53                 ed[v].push_back(u);
    54             }
    55         }
    56         int ans  =0;
    57         for(i = 0 ;i < n ;i++)
    58         {
    59             memset(vis,0,sizeof(vis));
    60             if(dfs(i))
    61             ans++;
    62         }
    63         printf("%d
    ",ans/2);
    64     }
    65     return 0;
    66 }
    View Code

    hdu1151   Air Raid

    最小路径覆盖 裸

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 #include<queue>
     8 #include<cmath>
     9 using namespace std;
    10 #define N 1010
    11 vector<int>pa[N];
    12 bool fx[N],fy[N];
    13 int vis[N],mat[N];
    14 int find(int u)
    15 {
    16     int i;
    17     for(i = 0 ; i < (int)pa[u].size() ; i++)
    18     {
    19         int v = pa[u][i];
    20         if(vis[v]) continue;
    21         vis[v] = 1;
    22         if(mat[v]==0||find(mat[v]))
    23         {
    24             mat[v] = u;
    25             return 1;
    26         }
    27     }
    28     return 0;
    29 }
    30 int main()
    31 {
    32     int n,m,i,t;
    33     scanf("%d",&t);
    34     while(t--)
    35     {
    36         scanf("%d%d",&n,&m);
    37         memset(mat,0,sizeof(mat));
    38         for(i = 1; i <= 1000 ; i++)
    39         pa[i].clear();
    40         for(i = 1; i <= m ;i++)
    41         {
    42             int v,u;
    43             scanf("%d%d",&u,&v);
    44             pa[u].push_back(v+n);
    45         }
    46         int s = 0;
    47         for(i = 1; i <= n ;i++)
    48         {
    49             memset(vis,0,sizeof(vis));
    50             if(find(i))
    51             s++;
    52         }
    53         printf("%d
    ",n-s);
    54     }
    55     return 0;
    56 }
    View Code

    hdu1350 Taxi Cab Scheme

    最小路径覆盖 

    根据时间限制建边 注意:当前结束点与下一个开始点不同也可以建边 

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 #include<cmath>
     8 #include<queue>
     9 #include<set>
    10 using namespace std;
    11 #define N 510
    12 #define LL long long
    13 #define INF 0xfffffff
    14 const double eps = 1e-8;
    15 const double pi = acos(-1.0);
    16 const double inf = ~0u>>2;
    17 vector<int>ed[N];
    18 int ma[N][N],mat[N];
    19 bool vis[N];
    20 struct node
    21 {
    22     int t,u,v;
    23     int u1,u2,v1,v2;
    24     int d;
    25 }p[N];
    26 int dfs(int u)
    27 {
    28     int i;
    29     for(i = 0; i < ed[u].size() ; i++)
    30     {
    31         int v = ed[u][i];
    32         if(vis[v]) continue;
    33         vis[v] = 1;
    34         if(mat[v]==-1||dfs(mat[v]))
    35         {
    36             mat[v] = u;
    37             return 1;
    38         }
    39     }
    40     return 0;
    41 }
    42 int main()
    43 {
    44     int n,m,i,j;
    45     int mod = 24*60;
    46     cin>>n;
    47     while(n--)
    48     {
    49         cin>>m;
    50         memset(ma,0,sizeof(ma));
    51         memset(mat,-1,sizeof(mat));
    52         for(i = 1; i <= m ;i++)
    53         ed[i].clear();
    54         int g = 0;
    55         for(i = 1; i<= m ;i++)
    56         {
    57             int x,y,u1,u2,v1,v2;
    58             scanf("%d%*c%d%d%d%d%d",&x,&y,&p[i].u1,&p[i].v1,&p[i].u2,&p[i].v2);
    59             /*if(!ma[u1][v1])
    60             {
    61                 g++;
    62                 ma[u1][v1] = g;
    63             }
    64             if(!ma[u2][v2])
    65             {
    66                 g++;
    67                 ma[u2][v2] = g;
    68             }
    69             p[i].u = ma[u1][v1],p[i].v = ma[u2][v2];*/
    70             p[i].d = abs(p[i].u1-p[i].u2)+abs(p[i].v1-p[i].v2);
    71             p[i].t = x*60+y;
    72         }
    73         for(i = 1 ;i <= m ;i++)
    74         {
    75             for(j = i+1 ;j <= m; j++)
    76             {
    77                 int tt = abs(p[i].u2-p[j].u1)+abs(p[i].v2-p[j].v1);
    78                 if(p[i].t+p[i].d+tt<p[j].t)
    79                 {
    80                     ed[i].push_back(j);
    81                 }
    82             }
    83         }
    84         int ans = 0;
    85         for(i = 1;i <= m ;i++)
    86         {
    87             memset(vis,0,sizeof(vis));
    88             if(dfs(i))
    89             ans++;
    90         }
    91         cout<<m-ans<<endl;
    92     }
    93     return 0;
    94 }
    View Code
  • 相关阅读:
    面向对象-------------------------------面向对象的零散小知识
    面向对象------------------------------反射(面向对象的又一个思路)
    面向对象-------------------------对象和类的属性
    面向对象------------------一些双下方法
    装饰器搞一下
    字符串切片取值规则
    On The Way—Step 2 Python入门之Python内容初始
    socket对于recv函数的理解
    Socket通信原理学习
    [SUCTF 2019]Pythonginx
  • 原文地址:https://www.cnblogs.com/shangyu/p/3715919.html
Copyright © 2020-2023  润新知