zoukankan      html  css  js  c++  java
  • hdu1704传递闭包

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1704

    传递闭包定义在关系集R上,如果关系R中既有元组(x,y)又有元组(y,z)则元组(x,z),将这样的具有最小性的关系集合就是传递闭包。还有解释:传递闭包、即在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系。例如,如果 X 是(生或死)人的集合而 R 是关系"为父子",则 R 的传递闭包是关系"x 是 y 的祖先"。再比如,如果 X 是空港的集合而关系 xRy 为"从空港 x 到空港 y 有直航",则 R 的传递闭包是"可能经一次或多次航行从 x 飞到 y"。

    这道题我们可以在X集(编号集合)上定义关系“赢”,则该关系是满足传递性的。可以用floyd求解传递闭包,传递闭包的传递公式是:dis[i][j]=dis[i][j]|(dis[i][k]&dis[k][j]) ,这道题唯一的注意点就是三重循环中的一个小优化。

    代码如下:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef unsigned int ui;
     4 typedef long long ll;
     5 typedef unsigned long long ull;
     6 #define pf printf
     7 #define mem(a,b) memset(a,b,sizeof(a))
     8 #define prime1 1e9+7
     9 #define prime2 1e9+9
    10 #define pi 3.14159265
    11 #define lson l,mid,rt<<1
    12 #define rson mid+1,r,rt<<1|1
    13 #define scand(x) scanf("%llf",&x) 
    14 #define f(i,a,b) for(int i=a;i<=b;i++)
    15 #define scan(a) scanf("%d",&a)
    16 #define mp(a,b) make_pair((a),(b))
    17 #define P pair<int,int>
    18 #define dbg(args) cout<<#args<<":"<<args<<endl;
    19 #define inf 0x7ffffff
    20 inline int read(){
    21     int ans=0,w=1;
    22     char ch=getchar();
    23     while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
    24     while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    25     return ans*w;
    26 }
    27 const int maxn=1000;
    28 int n,m,t;
    29 int dis[maxn][maxn];
    30 void floyd()
    31 {
    32     f(k,1,n)
    33         f(i,1,n)
    34         {
    35             if(dis[i][k])
    36             f(j,1,n)
    37             {
    38                 dis[i][j]=dis[i][j]|(dis[i][k]&dis[k][j]);//传递闭包 
    39              } 
    40         }    
    41             
    42  } 
    43  int ans=0;
    44 int main()
    45 {
    46     //freopen("input.txt","r",stdin);
    47     //freopen("output.txt","w",stdout);
    48     std::ios::sync_with_stdio(false);
    49     t=read();
    50     while(t--)
    51     {
    52         mem(dis,0);
    53         ans=0;
    54         n=read(),m=read();
    55         int x,y;
    56         while(m--)
    57         {
    58             x=read(),y=read();
    59             dis[x][y]=1;
    60         }
    61         floyd();
    62         f(i,1,n)
    63             f(j,i+1,n)
    64             {
    65                 if(!dis[i][j]&&!dis[j][i])ans++;//(i,j)之间没有关联,也就是不能推断出有输赢关系 
    66             }
    67             pf("%d
    ",ans) ;
    68      } 
    69 } 
    每一个不曾起舞的日子,都是对生命的辜负。
  • 相关阅读:
    docker常用操作
    docker-vlanhost
    打补丁说明
    mycat RULEs
    头晕的android SDK Manager and 找不到真机
    高格-一些特点的话题【抛入抛出关联】
    流程配置中心中的委托设置无法查看全部流程的问题
    验证flash player 是否正常
    kdpkg安装包解压
    go新环境Mac安装,包含okexchain
  • 原文地址:https://www.cnblogs.com/randy-lo/p/12590356.html
Copyright © 2011-2022 走看看