您的位置:首页 > 其它

HNACM(八)C-最少换乘

2016-04-07 17:13 232 查看
传送门

思路是如果两个站点在同一条线路上,那么他们之间的距离置1,如果不在同一条线路上,那么他们的距离至MAX(允许的最大整数),这样再运行迪杰斯特拉算法,那么找出来的路径就是最少换乘的路径,因为换乘一次,距离便会加1,这样输出的一定是最少换乘的。

#include <bits/stdc++.h>
#define N 510
#define ll long long
#define MAX 11111
using namespace std;
int n, m, Map

, tmp
, dis
;
bool vis
;
char s[10000];
int dij(){ //迪杰斯特拉算法求最少换乘
int i, j;
for (i = 1; i <= n; i++){
vis[i] = false;
dis[i] = Map[1][i];
}
if (dis
== 1){
dis
;
}
vis[1] = true;
for (i = 1; i < n; i++){
int mindist = MAX;
int u = -1;
for (j = 1; j <= n; j++){
if (!vis[j] && mindist > dis[j]){
u = j;
mindist = dis[j];
}
}
if (u == n){
return dis
;
}
if (u == -1){
return -1;
}
vis[u] = true;
for (j = 1; j <= n; j++){
if (!vis[j] && dis[j] > dis[u]+Map[u][j]){
dis[j] = dis[u]+Map[u][j];
}
}
}
}
int main(){
#ifndef ONLINE_JUDGE
//  freopen("1.txt", "r", stdin);
#endif
int i, j, k, T, t, len, t1;
scanf("%d", &T);
while(T--){
scanf("%d%d", &m, &n);
gets(s);
for (i = 0; i <= n; i++){
for (j = 0; j <= n; j++){
Map[i][j] = MAX;
}
Map[i][i] = 0;
}
for (i = 0; i < m; i++){
gets(s);//每次以字符串的方式入读
len = strlen(s);
t = 0;
k = 0;
for (j = 0; j < len; j++){//解析字符串
if (s[j] >= '0' && s[j] <= '9'){
t *= 10;
t += s[j]-'0';
}else{
if (t){
tmp[k++] = t;
t = 0;
}
}
}
tmp[k] = t;
len = k;
for (j = 0; j <= len; j++){
for (k = j+1; k <= len; k++){
Map[tmp[j]][tmp[k]] = 1;//把可以一次到达的两站置为1
}
}
}
int ans = dij();
if (ans > 0){
ans--;
printf("%d\n", ans);
}else{
puts("NO");//小于0说明不能到达
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: