图、Dijstra

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <iomanip>
#define UNVISITED 999
#define VISITED 1
using namespace std;
class Edge
{
public:
    int vertex,weight;
    Edge(){ vertex =-1;weight=-1;}
    Edge(int v,int w){ vertex =v; weight = w;}
};
class Graph
{
private:
    int numVertex,numEdge;
    int **matrix;
    int *mark;
public:
    Graph(int numVert)
    {
        int i,j;
        numVertex=numVert;
        numEdge=0;
        mark=new int[numVert];
        for(i=0;i<numVertex;i++)
        {
            mark[i]=UNVISITED;
        }
        matrix=(int**)new int*[numVertex];
        for(i=0;i<numVertex;i++)
        {
            matrix[i]=new int[numVertex];
        }
        for(i=0;i<numVertex;i++)
        {
            for(int j=0;j<numVertex;j++)
            {
                matrix[i][j]=10000;
            }
        }
    }
    ~Graph()
    {
        delete [] mark;
        for(int i=0;i<numVertex;i++)
        {
            delete [] matrix[i];
        }
        delete[] matrix;
    }
    int n(){return numVertex;}
    int e(){return numEdge;}
    int first(int v)
    {
        int i;
        for(i=0;i<numVertex;i++)
        {
            if(matrix[v][i]!=0)
            {
                return i;
            }
        }
        return i;
    }
    int next(int v1,int v2)
    {
        int i;
        for(i=v2+1;i<numVertex;i++)
        {
            if(matrix[v1][i]!=0)
            {
                return i;
            }
        }
        return i;
    }
    void setEdge(int v1,int v2,int wgt)
    {
        if(matrix[v1][v2]==0)
        {
            numEdge++;
        }
        matrix[v1][v2]=wgt;
    }
    void delEdge(int v1,int v2)
    {
        if(matrix[v1][v2]!=0)
        {
            numEdge--;
        }
        matrix[v1][v2]=0;
    }
    int weight(int v1,int v2)
    {
        return matrix[v1][v2];
    }
    int getMark(int v)
    {
        return mark[v];
    }
    void setMark(int v,int val)
    {
        mark[v]=val;
    }
};

int minVertex(Graph* G,int* D)
{
    int i,v;
    for(i=0;i<G->n();i++)
    {
        if(G->getMark(i)==UNVISITED)
        {
            v=i;break;
        }
    }
    for(i++;i<G->n();i++)
    {
        if((G->getMark(i)==UNVISITED)&&(D[i]<D[v]))
        {
            v=i;
        }
    }
    return v;
}
int Dijkstra(Graph* G,int *D,int * arr,int s,int C2)//可以通过数组地址的传递,在函数内可以对该数组进行访问和修改。
{
    int i,v,w;
    int sum=arr[s];
    for(i=0;i<G->n();i++)
    {
        v = minVertex(G,D);
        if(D[v]==10000)
        {
            return sum;
        }
        G->setMark(v,VISITED);
        for(w=G->first(v);w<G->n();w=G->next(v,w))
        {
            if(D[w]>=(D[v]+G->weight(v,w)))
            {
                D[w]=D[v]+G->weight(v,w);
                if(w==C2)
                {
                    sum+=arr[v];
                }
            }
        }
    }
//    return sum;
}
int main()
{
    int N,M,C1,C2;
    cin >> N >> M >> C1 >> C2;
    Graph G(N);
    int arr[N];//存放救援车数
    for(int i=0;i<N;i++)
    {
        cin >> arr[i];
    }
    for(int j=0;j<M;j++)
    {
        int a,b,c;
        cin >> a >> b >> c;
        G.setEdge(a,b,c);
    }
    int D[N];
    for(int i=0;i<N;i++)
    {
        D[i]=G.weight(C1,i);
    }
    int sum=Dijkstra(&G,D,arr,C1,C2);
    cout << D[C2] << " " << sum+arr[C2];

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值