2L. 一个人的旅行

#include<bits/stdc++.h>
using namespace std;
int dp[1005],V[1005];
int MAP[1005][1005];
const int inf=0x3f3f3f3f;
int minhh(int x,int y)
{
    if(x<=y)return x;
    else return y;
}
int main() 
{    
    int i,D,S,T,min,minn,a,b,s[1005],d[1005];
    while(scanf("%d %d %d",&T,&S,&D)!=EOF)
    {    
        memset(MAP,inf,sizeof(MAP));
        for(i=1;i<1005;i++)MAP[i][i]=0;
        while(T--)
        {
            scanf("%d %d %d",&a,&b,&i);
            MAP[a][b]=minhh(MAP[a][b],i);
            MAP[b][a]=MAP[a][b];
        }
        for(i=0;i<S;i++)scanf("%d",&s[i]);
        for(i=0;i<D;i++)scanf("%d",&d[i]);
        //录入题给信息
        minn=inf;
        for(a=0;a<S;a++)
        {
            memset(dp,inf,sizeof(dp));
            memset(V,-1,sizeof(V));
            for(i=1;i<=1000;i++)dp[i]=MAP[s[a]][i];
            while(1)
            {
                dp[1003]=inf;min=1003;T=0;//初始化 
                for(i=1;i<=1000;i++)
                {
                    if(V[i]==-1&&dp[i]<dp[min])min=i;
                }//找出最小边 
                for(b=0;b<D;b++)if(min==d[b]){T=-1;break;}//多个终点满足其中一个即可 
                if(T==-1)break;
                
                if(min==1003)break;//所有路径都考虑完了 
                V[min]=0;//表示这个城市考虑过了
                for(i=1;i<=1000;i++)
                {
                    if(V[i]==-1&&dp[i]>dp[min]+MAP[min][i])
                    dp[i]=dp[min]+MAP[min][i];
                }//松弛操作,更新到达每个城市的最短路径
            }
            minn=minhh(dp[min],minn);
        }//考虑不同起点的最短路径,找出最小的 
        printf("%d\n",minn);
    }
        
    return 0;
}
总结

1.上一题的延申,多个起点以及多个终点,都考虑就行

2.memset只有在初始化为0和-1时才能正常执行,比如初始化为1就会出错,原因是memset是按照字节赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值