zoukankan      html  css  js  c++  java
  • Week7 作业 A

    题目描述:

    有N个人,M个胜负关系,胜负关系用A B表示,表示A能胜过B,胜负关系具有传递性。问这N个人的两两比赛中,有多少个胜负关系不能通过给定的M个胜负关系事先确定。

    思路:

    不能确定的关系=N*(N-1)/2 - 能确定的关系, 求能确定的关系很显然就是求关系的传递闭包中,有多少个序偶。

    直接用沃舍尔算法求解,关系直接用数组dis[i][j]表示,存在关系(i,j),则dis[i][j]==1;

    算法中,值得注意的是,只用已经有的关系去更新关系,即当关系(i,k)不存在时,(k,j)就不可能被更新。

    代码:

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 using namespace std;
     5 const int MAXN=505;
     6 int dis[MAXN][MAXN];
     7 int T,N,M;
     8 int main()
     9 {
    10     cin>>T;
    11     while(T--)
    12     {
    13         memset(dis,0,sizeof(dis));
    14         cin>>N>>M;
    15         for(int i=1;i<=M;i++)
    16         {
    17             int A,B;
    18             scanf("%d %d",&A,&B);
    19             dis[A][B]=1;   //A->B 有一条有向边 
    20         }
    21         //求关系的传递闭包 
    22         for(int k=1;k<=N;k++)
    23             for(int i=1;i<=N;i++)
    24             {
    25                 if(dis[i][k]==0) continue;
    26                 for(int j=1;j<=N;j++)
    27                 {
    28                     if(dis[i][k]==1&&dis[k][j]==1) dis[i][j]=1;
    29                 }
    30             }
    31         int ans=0;
    32         for(int i=1;i<=N;i++)
    33             for(int j=1;j<=N;j++)
    34                 if(dis[i][j]==1) ans++; 
    35         cout<<N*(N-1)/2-ans<<endl;
    36     }
    37     return 0;
    38 }
  • 相关阅读:
    javaee
    前后台页面跳转及参数传递
    easyu几个常见问题
    利用easyUI填充表格数据
    easyUI数据转换为不同级别的数据
    Java数据结构漫谈-Vector
    RxJava漫谈-RxAndroid使用
    Java数据结构漫谈-Stack
    Java性能漫谈-数组复制之System.arraycopy
    Java数据结构漫谈-LinkedList
  • 原文地址:https://www.cnblogs.com/qingoba/p/12719254.html
Copyright © 2011-2022 走看看