1003 Emergency (25分) Dijkstra

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
using namespace std;
const int maxn = 2010;
const int INF = 0x3ffffff;
struct node
{
    int v;
    int edge;
};
int weight[maxn] = {0};
vector<node> A[maxn];
int n,m,c1,c2;
int d[maxn];
bool vist[maxn] = {false};
int num[maxn] = {0};
int w[maxn] = {0};
void Dijkstra()
{
//    vist[c1] = true;
    w[c1] = weight[c1];
    fill(d,d+n,INF);
    fill(num,num+n,0);
    num[c1] = 1;
    d[c1] = 0; //到自己的距離爲0
    for(int i = 0;i<n;i++)
    {
        int u = - 1,MIN = INF; //設置最小值和當前節點
        for(int j = 0;j < n;j++)  //找到最小距離的點
        {
            if(d[j]<MIN && vist[j] == false) //如果距離小於最小距離,更新
            {
                MIN = d[j];
                u = j;
//                num[j] = 1;
            }
        }
        if(u == -1) return; //如果找不到,則不連通推出
        vist[u] = true;
        for(int j = 0;j<A[u].size();j++)
        {
            int v = A[u][j].v;
            if(vist[v] == false)
            {
                if(d[v] > d[u] + A[u][j].edge)
                {
                    d[v] = d[u] + A[u][j].edge;
                    w[v] = w[u] + weight[v];
                    num[v] = num[u];
                }
                else if(d[v] == d[u] + A[u][j].edge)
                {
                    if(w[v] < w[u] + weight[v])
                        w[v] = w[u] + weight[v];
                    num[v] += num[u];
                }

            }
        }
    }
}

int main()
{
    freopen("1.txt","r",stdin);
    scanf("%d %d %d %d",&n,&m,&c1,&c2);
    for(int i = 0;i<n;i++)
    {
        int temp;
        scanf("%d",&temp);
        weight[i] = temp;
    }
    for(int i=0;i<m;i++)
    {
        int x1,x2,e;
        scanf("%d %d %d",&x1,&x2,&e);
        node t;
        t.v = x2;
        t.edge = e;
        A[x1].push_back(t);
        t.v = x1;
        A[x2].push_back(t);
    }
    Dijkstra();
    printf("%d %d",num[c2],w[c2]);

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章