最短路径——图、贪心算法

描述

N个城市,标号从0到N-1,M条道路,第K条道路(K从0开始)的长度为2^K,求编号为0的城市到其他城市的最短距离

输入描述:

第一行两个正整数N(2<=N<=100)M(M<=500),表示有N个城市,M条道路 接下来M行两个整数,表示相连的两个城市的编号

输出描述:

N-1行,表示0号城市到其他城市的最短路,如果无法到达,输出-1,数值太大的以MOD 100000 的结果输出。

示例1

输入:

4 4
1 2
2 3
1 3
0 1

输出:

8
9
11

解题思路:

(1)利用佛洛依德算法的思想来求解;

(2)初始化结点的根结点;

(3)初始化i=i的情况,初始化路径len数组;

(4)不同根结点才录入,相同,证明已有路径到达,且因为第K条道路(K从0开始)的长度为2^K;

(5)佛洛依德算法

代码:

#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>

const int INF=0x3f3f3f3f,mod=100000;
using namespace std;
int p[101];//定义根节点数组
int len[101][101];

int find(int x){  //找根结点
    if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++) p[i]=i; //初始化根结点

    memset(len,0x3f3f3f, sizeof(len));  //初始化
    for(int i=0;i<n;i++) len[i][i]=0; //原地不动

    for(int i=0,l=1;i<m;l=l*2%mod,i++){  //输入数据
        int a,b;
        cin>>a>>b;
        if(find(a)!=find(b)){  //不同根结点
            p[find(a)]=find(b);  //定义根结点
            len[a][b]=len[b][a]=l;  //两城市路径相等
        }
    }

    for(int k=0;k<n;k++){  //佛洛依德算法
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                len[i][j]=min(len[i][j], len[i][k]+len[k][j]);
            }
        }
    }

    for(int i=1;i<n;i++){
        if(len[0][i]==INF) cout<<-1<<endl;  //无法到达
        cout<<len[0][i]%mod<<endl;
    }

    return 0;
}

PS:参考某佬的思想

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值