第十一周周任务

非负权单源最短路
描述
给一个n( 1 <= n <= 2500 )个点,m条边( 1 <= m <= 6200 ) 的无向图,求s到t的最短路。
输入
第一行四个由空格隔开的整数 n、m、s、t。之后的m行,每行三个正整数 s[i]、t[i]、wi,表示一条从s[i]到t[i]长度为w[i]的边。
输出
一个整数表示从s到t的最短路长度。数据保证至少存在一条道路。
输入样例
7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1
输出样例
7

AC代码:

#include <bits/stdc++.h>
using namespace std;

int cost[3000][3000];
int d[2505];
int vis[2505];
int main()
{
    memset(cost ,0x3f ,sizeof(cost));
    memset(vis, 0, sizeof(vis));
    
    int n, m, s, t;
    scanf("%d%d%d%d", &n, &m, &s, &t);
    for (int i = 0; i < m; i++) {
        int s0, t0, w0;
        scanf("%d%d%d", &s0, &t0, &w0);
        cost[s0][t0] = min(cost[s0][t0], w0);
        cost[t0][s0] = min(cost[t0][s0], w0);
    }
    memset(d, 0x3f, sizeof(d));
    d[s] = 0;
    
    while (1) {
        int v = -1;
        for (int i = 1; i <= n; i++) {
            if (vis[i]==0 && (v==-1||d[i]<d[v])) v = i;
        }
        
        if (v==-1) break;
        vis[v] = 1;
        
        for (int i = 1; i <= n; i++)
            d[i] = min(d[i], d[v]+cost[v][i]);
    }
    
    printf("%d", d[t]);
    
    return 0;    
} 
View Code
posted @ 2019-05-23 22:18  sparkyen  阅读(258)  评论(0编辑  收藏  举报