• 洛谷 P2319 [HNOI2006]超级英雄(二分图匹配)


    传送门


    解题思路

    其实这道题和上一道题很像[SCOI2010]连续攻击游戏

    这道题就是题目和锦囊连边,然后题目从1开始往后枚举,注意也是如果一道答错就结束,输出答案。

    然后注意n是锦囊,m是题目,别弄反了。

    (ps:弄反了也能得90分!!)

    (数据真水!)

    AC代码

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 const int maxn=1005;
     5 int cnt,p[maxn],ok[maxn],vis[maxn],n,m,ans[maxn];
     6 struct edge{
     7     int v,next;
     8 }e[maxn*2];
     9 void insert(int u,int v){
    10     cnt++;
    11     e[cnt].v=v;
    12     e[cnt].next=p[u];
    13     p[u]=cnt;
    14 }
    15 bool work(int u){
    16     for(int i=p[u];i!=-1;i=e[i].next){
    17         int v=e[i].v;
    18         if(vis[v]) continue;
    19         vis[v]=1;
    20         if(!ok[v]||work(ok[v])){
    21             ok[v]=u;
    22             return true;
    23         }
    24     }
    25     return false;
    26 }
    27 int main()
    28 {
    29     memset(p,-1,sizeof(p));
    30     cin>>n>>m;
    31     for(int i=1;i<=m;i++){
    32         int v1,v2;
    33         cin>>v1>>v2;
    34         if(v1!=v2){
    35             insert(i,v1+1);
    36             insert(i,v2+1);    
    37         }else{
    38             insert(i,v1+1);
    39         }
    40     }
    41     for(int i=1;i<=m+1;i++){
    42         memset(vis,0,sizeof(vis));
    43         if(!work(i)){
    44             cout<<i-1<<endl;
    45             for(int j=1;j<=n;j++){
    46                 ans[ok[j]]=j;
    47             }
    48             for(int j=1;j<i;j++){
    49                 cout<<ans[j]-1<<endl; 
    50             }
    51             return 0;
    52         }
    53     }
    54     return 0;
    55 }

    //HNOI2006 Day1t1

  • 相关阅读:
    C语言中scanf()的用法
    Android学习笔记——Day3
    Android学习笔记——Day6
    Android学习笔记——Day5
    Android学习笔记——Day4
    Android学习笔记——Day2
    一个计时器按钮
    直方图均衡
    拉普拉斯算子进行图像边缘提取
    在jframe上显示超大号的文字
  • 原文地址:https://www.cnblogs.com/yinyuqin/p/12246367.html
Copyright © 2020-2023  润新知