hdu2066一个人的旅行

dijkstra算法,本题的技巧在于设置一个起点与S相连,设置一个终点与D相连,于是题目就变成了从起点到终点的最短距离了。
#include"stdio.h"
#define Inlimit 0xfffff
#define N 1005
int n,D[N],S[N],Map[N][N];

void initi()
{
    for(int i=0;i
    for(int j=0;j
        if(i==j)
            Map[i][j]=0;
        else
            Map[i][j]=Inlimit;
    }
}
int Dijkstra(int s,int t)
{
    int i,j,w,minc,mark[N];
    for (i=0;i<=n;i++)
    {
        if(i==s){
                mark[s]=1;D[s]=0;
        }
        else
        {
            D[i]=Map[s][i];
            mark[i]=0;
        }
    }
    for (i=1;i<=n;i++)
    {
        minc=Inlimit;
        w=s;
        for (j=1;j<=n;j++)
        if (!mark[j]&&minc>D[j]) {minc=D[j];w=j;}
            mark[w]=1;

        for (j=0;j<=n;j++)
        if (!mark[j]&&(D[j]>D[w]+Map[w][j]))D[j]=D[w]+Map[w][j];
    }
    return D[t];
}

int main()
{
  int t,s,d;
  while(scanf("%d%d%d",&t,&s,&d)!=EOF){
    initi();
    int a,b,time;
    n=0;
    while(t--){
        scanf("%d%d%d",&a,&b,&time);
        if(Map[a][b]>time)//因为a,b有多条路
        Map[a][b]=Map[b][a]=time;
        if(a>n)n=a;
        if(b>n)n=b;
    }
    ++n;
    int x,y;
    while(s--){
        scanf("%d",&x);
        Map[0][x]=Map[x][0]=0;//0与出发点相连
    }
    while(d--){
          scanf("%d",&x);
            Map[n][x]=Map[x][n]=0;//终点与n相连
    }
    printf("%d\n",Dijkstra(0,n));

  }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值