PAT1030

来源:互联网 发布:python 爬拉钩 编辑:程序博客网 时间:2024/06/08 01:14

输入

4 5 0 30 1 1 201 3 2 300 3 4 100 2 2 202 3 1 20

输出

0 2 3 3 40

程序

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;//最大顶点数 const int MAXV=510;const int INF=0x3fffffff;//n为顶点数,m为边数,st和ed分别为起点和终点//G为距离矩阵,cost为花费矩阵//d[]记录最短距离,c[]记录最小花费int n,m,st,ed,G[MAXV][MAXV],cost[MAXV][MAXV];int d[MAXV],c[MAXV],pre[MAXV];bool vis[MAXV]={false};//S为起点 void Dijkstra(int s){    fill(d,d+MAXV,INF);    fill(c,c+MAXV,INF);    for(int i=0;i<n;i++)    {        pre[i]=i;    }    d[s]=0;    c[s]=0;    for(int i=0;i<n;i++)    {        int u=-1,MIN=INF;        for(int j=0;j<n;j++)        {            if( vis[j]==false && d[j]<MIN )            {                u=j;                MIN=d[j];            }        }        if(u==-1)        {            return;        }        vis[u]=true;        for(int v=0;v<n;v++)        {            if( vis[v]==false && G[u][v]!=INF  )            {                if( d[u]+G[u][v]<d[v] )                {                    d[v]=d[u]+G[u][v];                    c[v]=c[u]+cost[u][v];                    pre[v]=u;                }                else if( d[u]+G[u][v]==d[v]  )                {                    if( c[u]+cost[u][v]<c[v]  )                    {                        c[v]=c[u]+cost[u][v];                        pre[v]=u;                    }                }            }        }    }}//打印路径 void DFS(int v){    if(v==st)    {        printf("%d",v);        return;    }    DFS(pre[v]);    printf(" %d",v);} int main(){    scanf("%d%d%d%d",&n,&m,&st,&ed);    int u,v;    //初始化图G     fill(G[0],G[0]+MAXV*MAXV,INF);    for(int i=0;i<m;i++)    {        scanf("%d%d",&u,&v);        scanf("%d%d",&G[u][v],&cost[u][v]);        G[v][u]=G[u][v];        cost[v][u]=cost[u][v];    }    //迪杰斯特拉算法入口     Dijkstra(st);    //打印路径     DFS(ed);    //最短距离、最短路径下的最小花费     printf(" %d %d\n",d[ed],c[ed]);    return 0;}
原创粉丝点击