poj 2139 Floyd-Warshall算法求最短路

  • 题意:不想说,这个题意思了,含糊不清=-=

    • Dijkstra算法,无法计算有负边的图,原因是有负边的图存在是会打乱Dijkstra算法的前提,当前优先队列取出点的距离为起点到该点的最小距离,因为如果后面有负边这个距离会更小。除此之外Bellman-Ford算法和Floyd-warshall算法都可以计算有负边的图,且判断是否有负圈。
    • Floyd-Warshall算法:该算法用到了动态规划归约的思想来求任意两点间的最短距离。令:d[k][i][j]为最短路可以包括0到k的所有顶点时i到j的最短距离,那么做一个归约为从0到k - 1的所有顶点中选择最短路,并且考虑是否包含第k个顶点的两种情况中最小的,即:d[k][i][j]=mind[k?1][i][j],d[k?1][i][k]+d[k?1][k][j]。这个算法有三重循环实现复杂度是O(|V|3)。
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int d[311][311], n, m, par[311], rank[311], team[311];

void get_team(void) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i == j) d[i][j] = 0;
            else d[i][j] = 0x3fffff;
        }
    }
    for (int i = 0; i < m; i++) {
        int x;
        scanf("%d", &x);
        for (int j = 0; j < x; j++) {
            scanf("%d", &team[j]);
        }
        for (int j = 0; j < x; j++) {
            for (int k = j + 1; k < x; k++) {
                if (team[k] == team[j]) continue;
                d[team[k] - 1][team[j] - 1] = 1;
                d[team[j] - 1][team[k] - 1] = 1;
            }
        }
    }
}

void Floyd_Warshall(void) {
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            for(int k = 0; k < n; k++) d[j][k] = min(d[j][k], d[j][i] + d[i][k]);
}

int average_max(void) {
    int max = 0x3fffff;
    for (int i = 0; i < n; i++) {
        int temp = 0;
        for (int j = 0; j < n; j++) {
             temp += d[i][j];
        }
        if(temp < max) swap(max, temp);
    }
    return max * 100 / (n - 1);
}

int main(void) {
    while (~scanf("%d%d", &n, &m)) {
        get_team();
        Floyd_Warshall();
        printf("%d\n",(int)average_max());
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 02:40:26

poj 2139 Floyd-Warshall算法求最短路的相关文章

Warshall算法求传递闭包

传递闭包 在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系. 例如,如果 X 是(生或死)人的集合而 R 是关系“为父子”,则 R 的传递闭包是关系“x 是 y 的祖先”.再比如,如果 X 是空港的集合而关系 xRy 为“从空港 x 到空港 y 有直航”,则 R 的传递闭包是“可能经一次或多次航行从 x 飞到 y”. Warshall算法 Warshall在1962年提出了一个求关系的传递闭包的有效算法.其具体过程如下,设在n个元素的有限集上关系R的关系矩

利用SPFA算法求最短路

该算法由Bellman-Ford算法演变过来,首先介绍一下Bellman-Ford算法 最短路最多经过n-1个点,可以用n-1轮松弛操作来得到 for(int i=0;i<n;i++) d[i]=INF; d[0]=0; for(int k=0;k<n-1;k++) for(int i=0;i<m;i++) //检查每条边 { int x=u[i]; int y=v[i]; if(d[x]<INF) d[y]=min(d[y],d[x]+w[i]); } 当然这个算法我没有实际应用

dijkstra算法求最短路

艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学.曾在1972年获得过素有计算机科学界的诺贝尔奖之称的图灵奖,之 后,他还获得过1974年 AFIPS Harry Goode Memorial Award.1989年ACM SIGCSE计算机科学教育教学杰出贡献奖.以及2002年ACM PODC最具影响力论文奖. 艾兹格·W·迪科斯彻(Edsger

[算法学习]Bellman-Ford算法求最短路

OAO dijkstra算法在复杂度方面是十分优秀的,但是其最大弊端就是无法处理带负权的图 (因为是基于已经被更新过的距离源点的边必然已经达到了最短路的这个事实 来采取贪心策略来求得最短路 而有负权路存在时,这个基础不在成立.) 这个时候就要请出Bellman-Ford算法了 (正确性证明:https://oi-wiki.org/graph/shortest-path/) 贴个代码emm: #include<bits/stdc++.h> using namespace std; //Bellm

POJ1860——Currency Exchange(BellmanFord算法求最短路)

Currency Exchange DescriptionSeveral currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and performs exchange operations only with these currencies. There can be several points sp

spfa算法求最短路

给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible. 数据保证不存在负权回路. 输入格式 第一行包含整数n和m. 接下来m行每行包含三个整数x,y,z,表示点x和点y之间存在一条有向边,边长为z. 输出格式 输出一个整数,表示1号点到n号点的最短距离. 如果路径不存在,则输出”impossible”. 数据范围 1≤n,m≤1051≤n,m≤105,图中涉及边长绝对值均不超过10000

用warshall算法求关系闭包(离散数学)

#include<stdio.h> main() { int i,n,j,k,a,b,x[100][100]; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&x[i][j]); for(i=1;i<=n;i++) for(j=1;j<=n;j++) for(k=1;k<=n;k++) { if(x[j]

POJ 2139 Six Degrees of Cowvin Bacon

Six Degrees of Cowvin Bacon Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2986   Accepted: 1390 Description The cows have been making movies lately, so they are ready to play a variant of the famous game "Six Degrees of Kevin Bacon&quo

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h