PTA 地铁一日游

输出的站需要在那里拍照

也就是说对于每次出发,输出1、出发站 2、线路末端的站点 3、相同费用情况下能走到的距离最远的站点(距离指最短路情况下)

代码来自网络,因为写到map那里的时候还太不会,先学习一下。

#include<stdio.h>
#include<iostream>
#include<map>
#include<vector>
#define MAX 205
#define INF 0x3f3f3f3f
using namespace std;

struct station{
    int visit,ends;
    station(){
        visit=ends=0;
    }
    vector<int> res;//所有可到达的站
}sta[MAX];

int mp[MAX][MAX];
int n,m,k;

void floyed(){//Floyed求最短路径
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i!=j&&mp[i][j]>mp[i][k]+mp[k][j]){
                    mp[i][j]=mp[i][k]+mp[k][j];
                }
            }
        }
    }
}

void dfs(int i,int vis){
    for(int j=0;j<sta[i].res.size();j++){
        int t=sta[i].res[j];
        if(sta[t].visit!=vis){
            sta[t].visit=vis;
            dfs(t,vis);
        }
    }
}

int main(){
    for(int i=0;i<MAX;i++){
        for(int j=0;j<MAX;j++){
            mp[i][j]=INF;
        }
    }
    scanf("%d%d%d",&n,&m,&k);
    int a,b,len;
    for(int i=0;i<m;i++){
        scanf("%d",&a);
        sta[a].ends=1;
        do{
            scanf("%d%d",&len,&b);
            if(len<mp[a][b]) mp[a][b]=mp[b][a]=len;
            a=b;
        }while(getchar()!='\n');
        sta[a].ends=1;
    }
    floyed();//求出最短路径
    for(int i=1;i<=n;i++){//对于每个站而言,寻找每个费用的最远距离,并将结果存入res中
        map<int,int> m1;
        for(int j=1;j<=n;j++){
            if(mp[i][j]!=INF&&mp[i][j]>m1[mp[i][j]/k+2]){
                m1[mp[i][j]/k+2]=mp[i][j];
            }
        }
        for(int j=1;j<=n;j++){
            if(mp[i][j]==m1[mp[i][j]/k+2]||(i!=j&&mp[i][j]!=INF&&sta[j].ends==1)){
               sta[i].res.push_back(j);
            }
        }
    }
    int q,start;
    scanf("%d",&q);
    for(int i=1;i<=q;i++){
        scanf("%d",&start);
        sta[start].visit=i;//打上标记i
        dfs(start,i);//将所有可能的站都打上标记i
        int flag=0;
        for(int j=1;j<=n;j++){
            if(sta[j].visit==i){
                printf("%s%d",flag==0?"":" ",j);
                flag=1;
            }
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/PdrEam/p/12911732.html