floyd

简介: floyd

模板

void floyd()
{
    int num;
    cin>>num;
    for(int i=1;i<=num;i++)
    {
        for(int j=1;j<=num;j++)
        {
            if(i==j)continue;
            else z[i][j]=0x3f3f3f3f;
        }
    }
    for(int k=1;k<=num;k++)
    {
        for(int i=1;i<=num;i++)
        {
            for(int j=1;j<=num;j++)
            {
                z[i][j]=min(z[i][j],z[i][k]+z[k][j]); 
            }
        }
    }
}

例题1

题解

#include<iomanip>//保留小数位数
#include<iostream> //c++
#include<algorithm> //sort排序
#include<cstring> //字符串
#include<math.h> //abs等函数
#include<map> //map
#include<set>//set
#include<cctype>
#define int long long //不开longlong见祖宗
#define endl '\n' //处理多数据时省时间
using namespace std;

int z[1110][1110];
int people[1110];
int num;
void floyd()
{
    for (int k = 1; k <= num; k++)
    {
        for (int i = 1; i <= num; i++)
        {
            for (int j = 1; j <= num; j++)
            {
                z[i][j] = min(z[i][k] + z[k][j],z[i][j]);
            }
        }
    }
}
signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0); //cin减少时间
    cout.tie(0); //cout减少时间
    cin >> num;
    //初始化自己到自己的距离为0 其他的都为无穷大
    for (int i = 1; i <= num; i++)
    {
        for (int j = 1; j <= num; j++)
        {
            if (i == j) z[i][j] = 0;
            else z[i][j] = 0x3f3f3f3f;
        }
    }
    for (int i = 1; i <= num; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        //记录当前医院的人数为a
        people[i] = a;
        if (b)
        {
            //双向的权值都赋值为1
            z[i][b] = 1;
            z[b][i] = 1;
        }
        if (c)
        {
            z[i][c] = 1;
            z[c][i] = 1;
        }
    }
    //使得两点的距离最小
    floyd();
    int ans = 0x3f3f3f3f;//先定义答案为无穷大
    //外层for循环定义结点 内层for循坏找答案
    for (int i = 1; i <= num; i++)
    {
        int sum = 0;
        for (int j = 1; j <= num; j++)
        {
            sum = sum + people[j] * z[i][j];//当前结点人数=j结点人数*ij之间的距离
        }
        ans = min(ans, sum);//找到最小值
    }
    cout << ans;

    return 0;
    //cout << setw(5) << setfill('0') << a << b;// 输出5位,右对齐,不足补0 。
}


目录
相关文章
|
7月前
|
存储 算法
Dijkstra
Dijkstra“【5月更文挑战第18天】”
57 6
|
7月前
|
Java
hdu-1874-畅通工程续(dijkstra + SPFA )
hdu-1874-畅通工程续(dijkstra + SPFA )
38 0
|
7月前
|
Java
hdu-2544-最短路(SPFA)
hdu-2544-最短路(SPFA)
35 0
|
算法
SPFA算法-最短路-负环
SPFA算法-最短路-负环
90 0
|
7月前
|
存储 算法
最短路之SPFA算法
最短路之SPFA算法
58 0
|
7月前
tarjan求强连通分量
tarjan求强连通分量
34 0
|
7月前
Poj 3255(dijkstra求次短路)
Poj 3255(dijkstra求次短路)
43 0
|
存储 算法
最短路径算法( Dijkstra + Bellman-Ford + SPFA + Floyd)
最短路径算法( Dijkstra + Bellman-Ford + SPFA + Floyd)
187 0
|
机器学习/深度学习 算法 程序员
【算法合集】深搜广搜Prim与Kruskal
广度优先搜索(BFS)又叫广搜,它像一个有远见的人,它是一层一层来实现搜索的,也挺像下楼梯的。 思路: 1.先初始化队列 q; 2.从起点开始访问,并且改变他的状态为已经访问; 3.如果他的队列非空,取出首个元素,将它弹出! 4.如果u == 目标状态,然后对所以与 u 邻近的点进入队列; 5.标记它已经被访问!...............
178 1
【算法合集】深搜广搜Prim与Kruskal