首页 > 其他分享 >AcWing 854. Floyd求最短路

AcWing 854. Floyd求最短路

时间:2023-08-15 21:03:05浏览次数:58  
标签:854 输出 每行 int 询问 整数 Floyd impossible AcWing

JWvFczgRNg.jpg

题目

给定一个 $n$ 个点 $m$ 条边的有向图,图中可能存在重边和自环,边权可能为负数。

再给定 $k$ 个询问,每个询问包含两个整数 $x$ 和 $y$,表示查询从点 $x$ 到点 $y$ 的最短距离,如果路径不存在,则输出 impossible

数据保证图中不存在负权回路。

输入格式 第一行包含三个整数 $n,m,k$。

接下来 $m$ 行,每行包含三个整数 $x,y,z$,表示存在一条从点 $x$ 到点 $y$ 的有向边,边长为 $z$。

接下来 $k$ 行,每行包含两个整数 $x,y$,表示询问点 $x$ 到点 $y$ 的最短距离。

输出格式 共 $k$ 行,每行输出一个整数,表示询问的结果,若询问两点间不存在路径,则输出 impossible

数据范围 $1≤n≤200,1≤k≤n^2,1≤m≤20000$,图中涉及边长绝对值均不超过 $10000$。

输入样例:

3 3 2
1 2 1
2 3 2
1 3 1
2 1
1 3

输出样例:

impossible
1

思路

Floyd基本思路

n -- 节点数
g -- 存放i到j的最短距离

for k in 1~n
    for i in 1~n
	for j in 1~n
	    g[i][j] = min(g[i][j], g[i][k] + g[k][j])

代码

#include <iostream>

using namespace std;

const int N = 210, INF = 1e9;

int n, m, z;
int g[N][N];

void floyd()
{
    // 对节点n进行3次循环
    for (int k = 1; k <= n; k ++ )
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= n; j ++ )
                g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
}

int main()
{
    scanf("%d%d%d", &n, &m, &z);
    
    // 初始化
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= n; j ++ )
        {
            if (i == j) g[i][j] = 0;
            else g[i][j] = INF;
        }
    
    while (m -- )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        g[a][b] = min(g[a][b], c);
    }
    
    floyd();
    
    while (z -- )
    {
        int x, y;
        scanf("%d%d", &x, &y);
        if (g[x][y] > INF / 2) puts("impossible");
        else printf("%d\n", g[x][y]);
    }
    
    return 0;
}

标签:854,输出,每行,int,询问,整数,Floyd,impossible,AcWing
From: https://blog.51cto.com/u_16170343/7093106

相关文章

  • AcWing 852. spfa判断负环
    题目给定一个$n$个点$m$条边的有向图,图中可能存在重边和自环,边权可能为负数。请你判断图中是否存在负权回路。输入格式第一行包含整数$n$和$m$。接下来$m$行每行包含三个整数$x,y,z$,表示存在一条从点$x$到点$y$的有向边,边长为$z$。输出格式如果图中存在负......
  • Acwing第116场周赛
    Acwing.第116场周赛这次做的稍微通畅一点,但是做到第三题还是发懒了,以后每次周赛打完都会有一个周赛总结第一题:简单判断给定三个非负整数x,y,z,请根据如下要求进行判断并输出结果:如果x>y+z,输出+;如果y>x+z,输出-;如果x=y并且z=0,则输出0;如果以上都不满足,则输出?......
  • AcWing116
    AcWing116AAcWing5134.简单判断voidsolve(){intx,y,z;cin>>x>>y>>z;if(x>y+z)cout<<'+'<<endl;elseif(y>x+z)cout<<'-'<<endl;elseif(x==......
  • AcWing 851. spfa求最短路
    题目给定一个$n$个点$m$条边的有向图,图中可能存在重边和自环,边权可能为负数。请你求出$1$号点到$n$号点的最短距离,如果无法从$1$号点走到$n$号点,则输出impossible。数据保证不存在负权回路。输入格式第一行包含整数$n$和$m$。接下来$m$行每行包含三个整......
  • acwing 116.飞行员兄弟 (算法竞赛进阶指南 p48 t1 ) 题解
    原题链接https://www.acwing.com/problem/content/description/118/题目描述“飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱。已知每个把手可以处于以下两种状态之一:打开或关闭。只有当所有把手都打开时,冰箱才会打开。把手可以表示为一个4х4的矩阵,您可以......
  • Codeforces 1854E - Game Bundles
    都这么会乱搞的吗/xia随机生成若干\(<30\)的数直到它们当中和为\(60\)的子集个数\(>k\)为止。删去最后一个元素。然后考虑贪心确定\(>30\)的部分,具体方法是按照\(dp_{60-x}\)从大到小贪心选,如果剩余子集个数\(\gedp_{60-x}\)就在序列中加入\(x\)。如此随机化直到找......
  • AcWing 850. Dijkstra求最短路 II
    题目给定一个$n$个点$m$条边的有向图,图中可能存在重边和自环,所有边权均为非负值。请你求出$1$号点到$n$号点的最短距离,如果无法从$1$号点走到$n$号点,则输出$−1$。输入格式第一行包含整数$n$和$m$。接下来$m$行每行包含三个整数$x,y,z$,表示存在一条从点$......
  • Floyd 算法
    Floyd算法:动态规划中的最短路径问题一、简介Floyd算法是一种用于求解图中所有顶点对之间最短路径的动态规划算法。它是由RobertW.Floyd在1965年提出的,因此得名Floyd-Warshall算法。该算法的核心思想是使用动态规划来避免重复计算已经计算过的子问题的解。二、原理假......
  • Acwing 849. Dijkstra求最短路 I
    题目给定一个$n$个点$m$条边的有向图,图中可能存在重边和自环,所有边权均为正值。请你求出$1$号点到$n$号点的最短距离,如果无法从$1$号点走到$n$号点,则输出$−1$。输入格式第一行包含整数$n$和$m$。接下来$m$行每行包含三个整数$x,y,z$,表示存在一条从点$x$......
  • 8/4 floyd
    Floyd#include<bits/stdc++.h>usingnamespacestd;intn,m,s,e;boolvis[10005];intINF=0x3f3f3f3f;intd[1005][1005];intp[1005][1005];intG[1005][1005];voidfloyd(){inti,j,k;for(i=1;i<=n;i++){for(j=1;j<=n;j++){......