hdu2544 最短路(SPFA算法)

SPFA算法,留个爪

 

#include <iostream>
#include <map>
using namespace std;
const int eps = 1000000;
const int size = 110;
int maze[size][size];
int n, m;
int dist[size];
int que[100*size];
bool visited[size];
void SPFA(int s)
{
     memset(visited, false, sizeof(visited));
     for (int i = 1; i <= n; i ++){
         dist[i] = eps;
         for (int j = 1; j <= n; j ++){
             if (!maze[i][j] && i != j){
                maze[i][j] = eps;               
             }
         }   
     }
     int rear, front;
     rear = 1, front = 0;
     que[front] = s;
     dist[s] = 0;
     visited[s] = true;
     while (front < rear){
           int u = que[front ++];
           visited[u] = false;
           for (int i = 1; i <= n; i ++){
               if (dist[i] > dist[u]+maze[u][i]){
                  dist[i] = dist[u] + maze[u][i];
                  if (!visited[i]){
                     que[rear ++] = i;
                     visited[i] = true;
                  }   
               }
           }
     }
}

int main()
{
   
    while (scanf("%d%d", &n, &m) != EOF && (m|n)){
          memset(maze, 0, sizeof(maze));
          while (m --){
                int a, b, c;
                scanf("%d%d%d", &a, &b, &c);
                if (maze[a][b] > c || maze[a][b] == 0){
                   maze[b][a] = maze[a][b] = c;
                }
          }
          SPFA(1);
          printf("%d\n", dist[n]);
    }
    return 0;   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值