zoukankan      html  css  js  c++  java
  • BZOJ1143: [CTSC2008]祭祀river

    1143: [CTSC2008]祭祀river

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 984  Solved: 490
    [Submit][Status]

    Description

    在遥远的东方,有一个神秘的民族,自称Y族。他们世代居住在水面上,奉龙王为神。每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动。我们可以把Y族居住地水系看成一个由岔口和河道组成的网络。每条河道连接着两个岔口,并且水在河道内按照一个固定的方向流动。显然,水系中不会有环流(下图描述一个环流的例子)。  由于人数众多的原因,Y族的祭祀活动会在多个岔口上同时举行。出于对龙王的尊重,这些祭祀地点的选择必须非常慎重。准确地说,Y族人认为,如果水流可以从一个祭祀点流到另外一个祭祀点,那么祭祀就会失去它神圣的意义。族长希望在保持祭祀神圣性的基础上,选择尽可能多的祭祀的地点。

    Input

    第一行包含两个用空格隔开的整数N、M,分别表示岔口和河道的数目,岔口从1到N编号。接下来M行,每行包含两个用空格隔开的整数u、v,描述一条连接岔口u和岔口v的河道,水流方向为自u向v。

    Output

    第一行包含一个整数K,表示最多能选取的祭祀点的个数。

    Sample Input

    4 4
    1 2
    3 4
    3 2
    4 2

    Sample Output

    2

    【样例说明】
    在样例给出的水系中,不存在一种方法能够选择三个或者三个以上的祭祀点。包含两个祭祀点的测试点的方案有两种:
    选择岔口1与岔口3(如样例输出第二行),选择岔口1与岔口4。
    水流可以从任意岔口流至岔口2。如果在岔口2建立祭祀点,那么任意其他岔口都不能建立祭祀点
    但是在最优的一种祭祀点的选取方案中我们可以建立两个祭祀点,所以岔口2不能建立祭祀点。对于其他岔口
    至少存在一个最优方案选择该岔口为祭祀点,所以输出为1011。

    HINT

    对于每个测试点:如果你仅输出了正确的被选取的祭祀点个数,那么你将得到该测试点30%的分数;如果你仅输出了正确的被选取的祭祀点个数与一个可行的方案,那么你将得到该测试点60%的分数;如果你的输出完全正确,那么你将得到该测试点100%的分数;【数据规模】 N ≤ 100 M ≤ 1 000

    题解:
    看到题后心里一想,这不是floyed之后 最大点独立集吗?
    唉?不对 这是二分图吗?感觉不是
    看了题解:拆点变成二分图。。。一口血喷出来。。。
    拆点之后就是二分图?呵呵。。。不理解
    代码:
     
     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<iostream>
     7 #include<vector>
     8 #include<map>
     9 #include<set>
    10 #include<queue>
    11 #define inf 1000000000
    12 #define maxn 110
    13 #define maxm 500+100
    14 #define eps 1e-10
    15 #define ll long long
    16 #define pa pair<int,int>
    17 using namespace std;
    18 inline int read()
    19 {
    20     int x=0,f=1;char ch=getchar();
    21     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    22     while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();}
    23     return x*f;
    24 }
    25 int p[maxn],n,m,f[maxn][maxn];
    26 bool v[maxn];
    27 bool find(int x)
    28 {
    29     for(int i=1;i<=n;i++)
    30     if (f[x][i])
    31      if(!v[i])
    32      {
    33          v[i]=1;
    34          if(!p[i]||find(p[i]))
    35          {
    36              p[i]=x;
    37              return 1;
    38          }
    39      }
    40     return 0; 
    41 }
    42 int main()
    43 {
    44     freopen("input.txt","r",stdin);
    45     freopen("output.txt","w",stdout);
    46     n=read();m=read();
    47     int x,y;
    48     while(m--)x=read(),y=read(),f[x][y]=1;
    49     for(int k=1;k<=n;k++)
    50      for(int i=1;i<=n;i++)
    51       for(int j=1;j<=n;j++)
    52        f[i][j]=f[i][j]||(f[i][k]&&f[k][j]);
    53     int ans=0;  
    54     for(int i=1;i<=n;i++)
    55      {
    56          memset(v,0,sizeof(v));
    57          if(find(i))ans++;
    58      }   
    59     printf("%d
    ",n-ans);
    60     return 0; 
    61 }
    View Code
  • 相关阅读:
    CSS3 target伪类简介
    不用position,让div垂直居中
    css3 在线编辑工具 连兼容都写好了
    a标签伪类的顺序
    oncopy和onpaste
    【leetcode】1523. Count Odd Numbers in an Interval Range
    【leetcode】1518. Water Bottles
    【leetcode】1514. Path with Maximum Probability
    【leetcode】1513. Number of Substrings With Only 1s
    【leetcode】1512. Number of Good Pairs
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3938001.html
Copyright © 2011-2022 走看看