迪杰斯特算法

 

 

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int maxn = 505;
const int INF = 99999;

struct node
{
    int length;
    int price;
}trl[maxn][maxn];
bool is[maxn] = {0};
queue<int> q;
int dis[maxn];
int money[maxn];
int path[maxn];
void Dijkstra(int str,int n)
{
    for(int i = 0;i<n;i++)
    {
        dis[i] = INF;
        money[i] = INF;
        if(i == str)
        {
            dis[i] = 0;
            money[i] = 0;
        }
        path[i] = -1;
    }
    q.push(str);
    int cur = str;
    while(!q.empty())
    {
        cur = q.front();
        is[cur] = true;
        q.pop();
        for(int i = 0;i<n;i++)
        {
            if(trl[cur][i].length!=-1&&!is[i]&&dis[i]>dis[cur]+trl[cur][i].length)
            {
                q.push(i);
                dis[i] = dis[cur]+trl[cur][i].length;
                money[i] = money[cur]+trl[cur][i].price;
                path[i] = cur;
            }
            else if(dis[i] == trl[cur][i].length+dis[cur] && money[i]>money[cur]+trl[cur][i].price)
            {
                dis[i] = trl[cur][i].length+dis[cur];
                money[i] = money[cur]+trl[cur][i].price;
                path[i] = cur;
            }
        }
    }
}
int main(void)
{
    int n,m,s,d;
    cin >> n >> m >> s >> d;
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<n;j++)
        {
            if(i == j)
            {
                trl[i][j].length = 0;
                trl[i][j].price = 0;
            }
            else 
            {
                trl[i][j].length = -1;
                trl[i][j].price = -1;
            }
        }
    }
    for(int i = 1;i<=m;i++)
    {
        int a,b,c,d; cin >> a >> b >> c >> d;
        trl[a][b].length = c;
        trl[a][b].price = d;
        trl[b][a].length = c;
        trl[b][a].price = d;
    }
    Dijkstra(s,n);
    cout << dis[d] << " " << money[d];
    return 0;
}

 

posted @ 2021-03-26 19:53  loliconsk  阅读(139)  评论(0)    收藏  举报