输出的站需要在那里拍照
也就是说对于每次出发,输出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; }