hdu2066

/*
分析:
    我一开始竟然用了S*D次Dijkstra……
用S次就能ac了,不过要100+MS,当然,枝剪一下时间就下来了,
下面的是我的31MS的。+_+0MS的都是怎么办到的……


                                                  2012-05-30
*/








#include"stdio.h"
#include"string.h"
struct A
{
    int ans;
    int flag;
    int pre;
}E[1010];
int map[1010][1010];
int main()
{
    int i,l,j;
    int s[555],e[555];
    int k;
    int hash[1010];                       //记录第几个城市是否出现
    int a,b,c;
    int t1,t2,t3;
    int min;
    while(scanf("%d%d%d",&a,&b,&c)!=-1)
    {
        memset(map,0,sizeof(map));
        memset(hash,0,sizeof(hash));


        for(i=0;i<a;i++)
        {
            scanf("%d%d%d",&t1,&t2,&t3);
            hash[t1]=hash[t2]=1;
            if(map[t1][t2]==0)        map[t1][t2]=map[t2][t1]=t3;
            else if(map[t1][t2]>t3)    map[t1][t2]=map[t2][t1]=t3;
        }


        for(i=0;i<b;i++)    {scanf("%d",&s[i]);hash[s[i]]=1;}
        for(i=0;i<c;i++)    {scanf("%d",&e[i]);hash[e[i]]=1;}


        min=111111111;
        for(i=0;i<b;i++)
        {
            for(j=1;j<1010;j++)
            {
                if(hash[j])
                {
                    E[j].ans=111111111;
                    E[j].flag=1;
                    E[j].pre=j;
                }
            }
            k=s[i];
            E[k].ans=0;
            while(k)
            {
                if(E[k].ans>=min)    break;
                E[k].flag=0;
                for(j=1;j<1010;j++)
                {
                    if(map[k][j]&&E[j].ans>E[k].ans+map[k][j])
                    {
                        E[j].ans=E[k].ans+map[k][j];
                        E[j].pre=k;
                    }
                }


                k=0;
                for(j=1;j<1010;j++)    if(hash[j]&&E[j].flag)    {k=j;break;}
                for(j++;j<1010;j++)    if(hash[j]&&E[j].flag&&E[j].ans<E[k].ans)    k=j;
            }


            for(l=0;l<c;l++)    min=min>E[e[l]].ans?E[e[l]].ans:min;
        }


        printf("%d\n",min);
    }
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值