hdu 2680 Choose the best route

一直在纠结时间相等时入队列的先后问题,突然发现自己二呀,路径相等的都会依次入队啊~~~

好了,说正事,最短路问题,用Dijkstra,注意几个地方:

1.这个问题可以倒过来想,从终点到这几个点中的最短距离。

2.路是有向的,如果倒过来想问题,那么路的方向也要倒过来。

eg: 输入1 2 5即从1到2的时间是5,那么如果倒过来考虑(以她朋友的家为起点),就要记录w[2][1]=5;

#include <iostream>
#include<queue>
#include<stdio.h>
#include<cstring>
using namespace std;
const int INF=100000000;
int visit[1005],w[1005][1005],d[1005];
int main()
{
    int n,m,s,ok,re,i,j,p,q,t,e;
    while(scanf("%d %d %d",&n,&m,&s)!=EOF){
      memset(visit,0,sizeof(visit));
      for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){
            w[i][j]=INF;
            d[i]=(i==s?0:INF);
        }
        for(i=1;i<=m;i++){
          scanf("%d %d %d",&p,&q,&t);
          if(w[q][p]>t) w[q][p]=t;
        }
        queue<int>que;
        que.push(s);
        visit[s]=1;
        while(!que.empty()){
          int min=INF;
          ok=0;
          int temp=que.front();
          que.pop();
          for(i=1;i<=n;i++){
            if(visit[i]==0&&i!=temp){
              if(d[i]>d[temp]+w[temp][i]){
                d[i]=d[temp]+w[temp][i];
              }
              if(d[i]<min){
                ok=1;
                re=i;
                min=d[i];
              }
            }
          }
            if(ok==1){
          que.push(re);
          visit[re]=1;
          }
        }
        int ans=INF;
        int choice;
        scanf("%d",&choice);
        for(i=1;i<=choice;i++){
          scanf("%d",&e);
          if(d[e]<ans) ans=d[e];
        }
        if(ans==INF) printf("-1\n");
        else printf("%d\n",ans);

    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值