poj 1797 dijkstra最短路径

题目:http://poj.org/problem?id=1797

题意:N个城市,M条路,求从城市1到每个城市之间都选路最宽的情况下,最窄的方案是多少,相当于把最短路径问题换成了最“宽”路径,城市之间的距离换成了城市之间道路的宽度


这里的dijkstra  

for(1到N)

for(1到N)

求出离远点之间路最宽的城市是哪一个


选出这个和远点并到集合vis中,表示这个城市已经选定过了,是最短情况


for(1到N)

从1到N更新每个点到原点的最宽路的情况,也就是进行判断(path[j] 中的数更大 还是mins(path[point],maps[point][j]) 更大)再重新覆盖path[j]


所有循环进行完后,path[n]肯定是最窄的,因为大循环中第一个小循环是从宽到窄进行的循环,找到点归到集合中的

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <cstring>
#include <algorithm>
#include <cmath>


using namespace std;

#define N 1003
#define maxn (1<<30)
#define mins(a,b) (a<b?a:b)

int maps[N][N],vis[N],path[N],n,m;


int dijkstra(){
    int i,j,point;
    vis[1]=1;
    for(i=1;i<=n;i++){
        path[i] = maps[1][i];
    }
    for(i=1;i<=n;i++){
        int tmp = -1;
        for(j=1;j<=n;j++){
            if(path[j]>tmp&&!vis[j]){
                tmp = path[j];
                point =j;
            }
        }
        vis[point]=1;
        for(j=1;j<=n;j++){
            if(!vis[j]&&mins(path[point],maps[point][j])>path[j])
                path[j]=mins(path[point],maps[point][j]);
        }

    }
    return path[n];
}

int main(){
    int cases,i,j,a,b,c;
    scanf("%d",&cases);
    for(int t=1;t<=cases;t++){
        memset(maps,0,sizeof(maps));
        memset(vis,0,sizeof(vis));
        memset(path,0,sizeof(path));
        cin>>n>>m;
        for(i=1;i<=m;i++){
            scanf("%d%d%d",&a,&b,&c);
            maps[a][b]=maps[b][a]=c;
        }
        printf("Scenario #%d:\n",t);
        printf("%d\n\n",dijkstra());
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值