hdu 2544 最短路(水题,dijkstra)

小记:本想用dp来做,但是不晓得如何处理环,于是改用dijkstra了。 如果想看邻接表解决的可以参看我的这篇 《spfa+邻接表》


小记:裸dijkstra就可以过


代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>

using namespace std;

#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-8

const int MAX_ = 110;
const int N = 100010;
const int INF = 0x7fffffff;

int dp[MAX_], mp[MAX_][MAX_];
bool vis[MAX_];
int n, m;

void dijkstra(int start)
{
        for(int i = 1; i <= n; ++i){
            dp[i] = INF;
            vis[i] = 0;
        }
        queue<int >q;
        q.push(start);
        dp[start] = 0;

        for(int i = 0; i < n; ++i){
            int k, mmin = INF;
            for(int j = 1; j <= n; ++j){
                if(!vis[j] && dp[j] < mmin){
                    mmin = dp[j];
                    k = j;
                }
            }
            vis[k ] = 1;

            for(int j = 1; j <= n; ++j){
                if(!vis[j] && mp[k][j] && dp[j] > dp[k] + mp[k][j]){
                    dp[j] = dp[k] + mp[k][j];
                }
            }
        }
}

int main(){
    int s, t, v;
	while(scanf("%d%d",&n,&m),n||m){
	    mst(mp,0);
            for(int i = 0; i < m; ++i){
                scanf("%d%d%d",&s,&t,&v);
                mp[s][t] = mp[t][s] = v;
            }

            dijkstra(1);

            printf("%d\n",dp[n]);
	}
	return 0;
}


你可能感兴趣的:(hdu 2544 最短路(水题,dijkstra))