【PAT】1030. Travel Plan

来源:互联网 发布:淘宝退款不退货漏洞 编辑:程序博客网 时间:2024/05/26 12:07

考查点:Dijkstra

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <vector>#include <map>#include <set>#include <queue>#include <stack>#define FOR(i, x, y) for(int i = x; i <= y; i++)#define rFOR(i, x, y) for(int i = x; i >= y; i--)#define MAX 501#define oo 0x3f3f3f3fusing namespace std;int G[MAX][MAX],w[MAX][MAX],pre[MAX],dis[MAX],cost[MAX],vis[MAX],n;void DJ(int s){    fill(dis,dis+MAX,oo);    fill(cost,cost+MAX,oo);    for(int i=0;i<n;i++)pre[i]=-1;    dis[s]=0,cost[s]=0;    for(int i=0;i<n;i++){        int MIN=oo;        int u=-1;        for(int j=0;j<n;j++)        {            if(vis[j]==0&&dis[j]<MIN){                MIN=dis[j];                u=j;            }        }        if(u==-1) return;        vis[u]=1;        for(int v=0;v<n;v++){            if(vis[v]==0&&G[u][v]!=oo){                if(dis[v]>G[u][v]+dis[u]){                    dis[v]=dis[u]+G[u][v];                    cost[v]=cost[u]+w[u][v];                    pre[v]=u;                }else if(dis[v]==G[u][v]+dis[u]){                    if(cost[v]>cost[u]+w[u][v]){                        cost[v]=cost[u]+w[u][v];                        pre[v]=u;                    }                }            }        }    }}void DFS(int s,int dd){    if(dd==s)    {        printf("%d",s);        return;    }    DFS(s,pre[dd]);    printf(" %d",dd);}int main(){    int m,St,D;    fill(G[0],G[0]+MAX*MAX,oo);    fill(w[0],w[0]+MAX*MAX,oo);    scanf("%d%d%d%d",&n,&m,&St,&D);    int u,v;    for(int i=0;i<m;i++)    {        scanf("%d%d",&u,&v);        scanf("%d%d",&G[u][v],&w[u][v]);        G[v][u]=G[u][v];w[v][u]=w[u][v];    }    DJ(St);    DFS(St,D);    printf(" %d %d\n",dis[D],cost[D]);    return 0;}


0 0