1011-K专题四

1.题意:输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个; 接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时,接着的第T+1行有S个数,表示和草儿家相连的城市; 接着的第T+2行有D个数,表示草儿想去地方,求草儿能去某个喜欢的城市的最短时间。

2.思路:类似于最短路径问题,采用spfa算法,不同的是在指定的点中选出,而不是在所有点里

    #include <cstdio>  
    #include <cstring>  
    #include <queue>  
    #define INF 1000000000  
    #define MAX 1010  
    using namespace std;  
      
    int map[MAX][MAX],n;  
    int dis[MAX];  
    bool vin[MAX];  
    queue<int> q;  
      
    void spfa()  
    {  
        int j,u;  
        while(!q.empty())  
        {  
            u=q.front();  
            q.pop();  
            vin[u]=0;  
            for(j=1;j<=n;j++)  
            {  
                if(map[u][j])  
                {  
                    int len=dis[u]+map[u][j];  
                    if(dis[j]>len)  
                    {  
                        dis[j]=len;  
                        if(!vin[j])  
                        {  
                            q.push(j);  
                            vin[j]=1;  
                        }  
                    }  
                }  
            }  
        }  
    }  
      
    void Init(int s)  
    {  
        int i,m;  
        memset(vin,0,sizeof(vin));  
        while(!q.empty()) q.pop();  
        for(i=0;i<s;i++)  
        {  
            scanf("%d",&m);  
            dis[m]=0;  
            if(!vin[m]) q.push(m);  
            vin[m]=1;  
        }  
    }  
      
    int main()  
    {  
        int i,t,s,d,a,b,l,m,ans;  
        //freopen("data.txt","r",stdin);  
        while(scanf("%d %d %d",&t,&s,&d)!=EOF)  
        {  
            memset(map,0,sizeof(map));  
            n=-1;  
            for(i=0;i<t;i++)  
            {  
                scanf("%d %d %d",&a,&b,&l);  
                if(map[a][b]<=0 || map[a][b]>l) map[a][b]=l;  
                if(map[b][a]<=0 || map[b][a]>l) map[b][a]=l;  
                n=a>n ? a : n;  
                n=b>n ? b : n;  
            }  
            for(i=1;i<=n;i++) dis[i]=INF;  
            Init(s);  
            spfa();  
            ans=INF;  
            for(i=0;i<d;i++)  
            {  
                scanf("%d",&m);  
                ans=dis[m]<ans ? dis[m] :  ans;  
            }  
            printf("%d\n",ans);  
        }  
        return 0;  
    }  


你可能感兴趣的:(1011-K专题四)