http://acm.hdu.edu.cn/showproblem.php?pid=1874

 

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include <iostream>
#include<algorithm>
#include<queue>
#define maxn 400
#define oo 0x3f3f3f3f
using namespace std;
int maps[maxn][maxn], dist[maxn],v[maxn];
int n, m;

void Init()
{
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            if(i==j)
                maps[i][j]=0;
            else
                maps[i][j]=maps[j][i]=oo;
        }
    }
}


void Dij(int x, int y)
{
    memset(v, 0, sizeof(v));
    for(int i=0; i<n; i++)
        dist[i]=maps[x][i];

    v[x] = 1;

    for(int i=1; i<n; i++)
    {
        int index=-1, mins=oo;

        for(int j=0; j<n; j++)
        {
            if(!v[j] && dist[j]<mins)
            {
                index = j;
                mins = dist[j];
            }
        }

        v[index] = 1;

        for(int j=0; j<n; j++)
        {
            if(!v[j] && dist[j]>maps[index][j]+mins)
                dist[j] = maps[index][j]+mins;
        }
    }

    if(dist[y]==oo)
        printf("-1\n");
    else
        printf("%d\n", dist[y]);
}

int main()
{
    int a, b, c, start, ends;

    while(scanf("%d %d", &n, &m)!=EOF)
    {

        Init();

        for(int i=1; i<=m; i++)
        {
            scanf("%d %d %d", &a, &b, &c);
            maps[a][b]=maps[b][a]=min(maps[a][b], c);
        }

        scanf("%d %d", &start, &ends);

        Dij(start, ends);

    }
    return 0;
}
View Code

 

posted on 2016-08-04 15:26  不忧尘世不忧心  阅读(124)  评论(0编辑  收藏  举报