专题四 · 1009

代码及解释

#include <iostream>
#include <cstring>

// 简单的 Floyd
// 初始化的一个技巧是用 unsigned int 然后初始化 -1
// 更像是一个 trick
// 还有一个是 INT_MAX 位于 limits.h
// 更好的选择是
// std::numeric_limits<decltype(G[0][0])>::max
// 位于 limits

const int SIZE = 110;
unsigned int G[SIZE][SIZE];

int N,M;
void Floyd() {
  for(int k = 0; k < N; ++k)
    for(int i = 0; i < N; ++i)
      for(int j = 0; j < N; ++j)
        G[i][j]= std::min(G[i][j], G[i][k] + G[k][j]);

}

int main() {
  while(std::cin >> N >> M && N + M) {
    memset(G, -1, sizeof(G));

    for(int i = 0; i < N; ++i)
      G[i][i] = 0;

    int x,y;
    for(int i = 0; i < M; ++i) {
      std::cin >> x >> y >> G[y][x];
      G[x][y] = G[y][x];
    }

    Floyd();
    std::cout << G[0][N - 1] << std::endl;
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值