首页 > 其他 > 详细

1030 Travel Plan (30分)

时间:2020-09-13 10:41:59      阅读:46      评论:0      收藏:0      [点我收藏+]

 

1030 Travel Plan (30分)

#include<stdio.h>
#include<iostream>
using namespace std;
const int maxn=1010;
const int INF=1000000000;
int n,m,c1,c2;
int G[maxn][maxn],d[maxn];
int cost[maxn][maxn],c[maxn];
int vis[maxn];
int pre[maxn];
void dijkstra(int s){
    fill(d,d+maxn,INF);
    fill(c,c+maxn,0);  
    for(int i=0;i<maxn;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]==0&&d[j]<min){
                u=j;
                min=d[j];
            }
        }
        if(u==-1)return;
        vis[u]=1;
        for(int v=0;v<n;v++){
            if(vis[v]==0&&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]&&c[v]>c[u]+cost[u][v]){
                    pre[v]=u;
                    c[v]=c[u]+cost[u][v];
                }
            }
        }
    }
}
void DFS(int s,int v){
    if(v==s){
        printf("%d ",s);
        return;
    }
    DFS(s,pre[v]);
    printf("%d ",v);
}
int main()
{
    scanf("%d %d %d %d",&n,&m,&c1,&c2);
    int a0,b0,c0,d0;
    fill(G[0],G[0]+maxn*maxn,INF);        //又忘初始化了
    for(int i=0;i<m;i++){
        scanf("%d %d %d %d",&a0,&b0,&c0,&d0);
        G[a0][b0]=c0;
        cost[a0][b0]=d0;
        G[b0][a0]=c0;
        cost[b0][a0]=d0;
    }
    dijkstra(c1);
    DFS(c1,c2);
    printf("%d %d",d[c2],c[c2]);
    return 0;
}

  

1030 Travel Plan (30分)

原文:https://www.cnblogs.com/1012wenquan66/p/13660377.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!