(Dijkstra模板)

来源:互联网 发布:windows管理员权限cmd 编辑:程序博客网 时间:2024/05/22 16:50
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>


#define ll __int64
#define lll unsigned long long
#define MAX 1000009
#define MAXN 5555
#define eps 1e-8
#define INF 0xfffffff
#define mod 1000000007
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1


using namespace std;
/*
题意:模板


想法:单源最短路


*/
int n;
int Edge[MAXN][MAXN];//邻接矩阵
int s[MAXN];//判断点是否加入
int dist[MAXN];//每个点与源点的最短距离
int path[MAXN];//路径
int i,j,k;


void init()
{
    int i,j;
    for(i=0;i<MAXN;i++)
    {
        for(j=0;j<MAXN;j++)
        {
            Edge[i][j]=MAX;
        }
    }
}


void Dijstra(int v0)
{
    for(i = 1;i<=n;i++)
    {
        dist[i] = Edge[v0][i];
        s[i] = 0;
    }
    s[v0] = 1;
    dist[v0] = 0;
    for(i = 1;i<=n;i++)
    {
        int min = MAX;
        int u = -1;
        for(j = 1;j<=n;j++)
        {
            if(!s[j]&&dist[j]<min)
            {
                u = j;
                min = dist[j];
            }
        }
        s[u] = 1;
        for(k = 1;k<=n;k++)
        {
            if(!s[k]&&(dist[u]+Edge[u][k]<dist[k]))
            {
                dist[k] = dist[u]+Edge[u][k];
            }
        }
    }
}
int main()
{
    int m,d,e;
    int a,b,c;
    while(~scanf("%d%d%d%d",&n,&m,&d,&e))
    {
        init();
        for(i = 0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            if(Edge[a][b]>c)
            {
                Edge[a][b] = Edge[b][a] = c;
            }
        }
        Dijstra(d);
        printf("%d\n",dist[e]);
    }
    return 0;
}
0 0
原创粉丝点击