poj3660 Cow Contest(Floyd-Warshall方法求有向图的传递闭包)

poj3660 Cow Contest(Floyd-Warshall方法求有向图的传递闭包)

poj3660

题意: 

有n头牛, 给你m对关系(a, b)表示牛a能打败牛b, 求在给出的这些关系下, 能确定多少牛的排名。

分析:

在这呢先说一下关系闭包:  

关系闭包有三种: 自反闭包(r), 对称闭包(s), 传递闭包(t)。

先画出 R 的关系图,再画出 r(R), s(R), t(R) 的关系图。

poj3660 Cow Contest(Floyd-Warshall方法求有向图的传递闭包)        poj3660 Cow Contest(Floyd-Warshall方法求有向图的传递闭包)       poj3660 Cow Contest(Floyd-Warshall方法求有向图的传递闭包)       poj3660 Cow Contest(Floyd-Warshall方法求有向图的传递闭包)

我们今天用的是传递闭包。   仅作为个人理解 传递闭包: 关系之间具有传递性(例如a> b, b> c, 那么a> c), 在那些已给出的关系基础上, 通过传递性, 把所有可能的关系都找出来。  如上图。

 

这里需要先求一下所有牛之间的传递闭包, 那么我们这题与传递闭包又有什么关系呢。 下面将慢慢解答。 

如果一头牛被x头牛打败,并且可以打败y头牛,如果x+y=n-1,则我们容易知道这头牛的排名就被确定了,所以我们只要将任一头牛,可以打败其他的牛的个数x, 和能打败该牛的牛的个数y求出来,在遍历所有牛判断一下是否满足x+y=n-1,就知道这个牛的排名是否能确定了(而传递闭包,正好将所有能得出关系都求出来了), 再将满足这个条件的牛数目加起来就是所求解。 x可以看成是入度, y是出度。

 

在floyd-warshall(不了解该算法的点这里)求每对顶点间的最短路径算法中,可以通过O(v^3)的方法求出图的传递闭包。可以位每条边赋以权值1,然后运行Floyd-Wareshall。如果从  i  到  j  存在一条路径,则d(i,j)<N,否则d(i,j)=MAX。

 

 一种改进的算法是:由于我们需要的只是判断是否从i到j存在一条通路,所以在Floyd-Wareshall中的动态规划比较中,我们可以把min和+操作改为逻辑or( ||  )和逻辑(&&)也就是将  d[i][j] = min(d[i][j],  d[i][k]+dist[k][j]);    改成    if(d[i][j] == 1 || (d[i][k] == 1 && d[k][j] == 1))   d[i][j] = 1;

设  d(i,j) = 1表示从 i 到 j 存在一条通路 p,且 p 的所有中间节点都在0,1,2,…,k中, 否则d(i,j)=0。我们把边(i,j)加入到E*中当且仅当d(i,j)=1。

#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<vector>
using namespace std;

int n, m, ans, v[110][110];

void floyd()//求图的闭包, 把所有可以确定的关系都求出来
{
    for(int k = 1; k <= n; k++)
    {
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                if(v[i][j] == 1 || (v[i][k] == 1 && v[k][j] == 1))
                    v[i][j] = 1;
            }
        }
    }
}
int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
    {
        memset(v, 0, sizeof(v));
        for(int i = 1; i <= m; i++)
        {
            int x, y;
            scanf("%d%d", &x, &y);
            v[x][y] = 1;
        }
        floyd();

        ans = 0;
        for(int i = 1; i <= n; i++)
        {
            int du = 0;
            for(int j = 1; j <= n; j++)//对于每头牛, 求是否有唯一排名
            {
                if(i == j) continue;
                if(v[i][j] == 1 || v[j][i] == 1)
                    du++;
            }
            if(du == n-1)
                ans++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/wd-one/p/4545086.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109433.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 关于大数据平台,这有一套完整的方法论,你确定不收藏?[通俗易懂]

    关于大数据平台,这有一套完整的方法论,你确定不收藏?[通俗易懂]大数据时代这个词被提出已有10年了吧,越来越多的企业已经完成了大数据平台的搭建。随着移动互联网和物联网的爆发,大数据价值在越来越多的场景中被挖掘,随着大家都在使用欧冠大数据,大数据平台的搭建门槛也越来越低。借助开源的力量,任何有基础研发能力的组织完全可以搭建自己的大数据平台。但是对于没有了解过大数据平台、数据仓库、数据挖掘概念的同学可能还是无法顺利完成搭建,因为你会发现太多的东西,和架构,你不知道如何去选择。今天给大家分享下大数据平台是怎么玩的。架构总览通常大数据平台的架构如上,从.

    2022年6月3日
    32
  • 让旧Mac免费获得 iWork 套件的秘籍「建议收藏」

    让旧Mac免费获得 iWork 套件的秘籍「建议收藏」让旧Mac免费获得iWork套件的秘籍2013-10-2409:13iapps.im只要购买了苹果新设备就可以免费获得iWork和iLife套件。但是我们拥有旧Mac的人呢?昨夜大家是不是一夜无眠呀,数数手头有多少钱,银行卡可以刷多少,才能抱回几个心仪的设备呢!苹果对新Mac的政策也如当时对iPhone5s一样,只要购买了新设备就可以免费获得iW

    2025年6月18日
    3
  • OpenCV实现SfM(二):双目三维重建[通俗易懂]

    OpenCV实现SfM(二):双目三维重建[通俗易懂]使用OpenCV3.0实现双目三维重建,原理清晰,实践有效。

    2022年6月20日
    35
  • java数组转对象_java之数组和对象的互转「建议收藏」

    java数组转对象_java之数组和对象的互转「建议收藏」java*对象转bytes和bytes转对象**@projectorder*@fileNameByteUtil.java*@Description*@authorlight-zhang*@date2019年5月16日*@version1.0.0*/publicclassByteUtil{/***对象转数组**@paramobj*@return*/public…

    2025年10月19日
    5
  • APK签名流程介绍[通俗易懂]

    APK签名流程介绍[通俗易懂]实际上,现在Android开发IDE自带签名功能,但是有时我们还是可能遇到自己签名apk的场景的,比如你有一个未签名的apk,但是你要adbinstall到device上,这时我们在adbinstall之前就必须对该apk进行签名处理才能install成功,这篇文章就简单的介绍下apk签名流程吧。1、生成签名证书签名需要签名证书,签名证书类型实际上是有很多的,如jks、keysto…

    2022年6月13日
    41
  • 321_MediaType Media Type 是什么

    321_MediaType Media Type 是什么MediaType是什么MediaType在网络协议的消息头里面叫做Content-Type使用两部分的标识符来确定一个类型所以我们用的时候其实就是为了表明我们传的东西是什么类型比如application/json:JSON格式的数据,在RFC4627中定义application/javascript:JavaScript,在RFC4329中定义但是…

    2022年5月9日
    81

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号