HNACM(八)C-最少换乘
2016-04-07 17:13
232 查看
传送门
思路是如果两个站点在同一条线路上,那么他们之间的距离置1,如果不在同一条线路上,那么他们的距离至MAX(允许的最大整数),这样再运行迪杰斯特拉算法,那么找出来的路径就是最少换乘的路径,因为换乘一次,距离便会加1,这样输出的一定是最少换乘的。
思路是如果两个站点在同一条线路上,那么他们之间的距离置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; }
相关文章推荐
- decimal使用
- eclipse运行mapreduce 提示:Caused by: java.lang.ArrayIndexOutOfBoundsException
- C++/MFC CString,string,char*转换
- ios中天女散花效果
- Leetcode no. 40
- 自定义EL函数
- 10个随机整数和 方法2
- 9个循环9
- MFC对话框控件数据提取之DoDataExchange()
- 随机十个数求和3
- LIVE555,RTSP、RTP/RTCP协议介绍
- 文章标题
- 华为RAID 1阵列卡设置教程图文详解
- CentOS(Linux)中解决MySQL中文乱码
- 菱形虚拟继承&虚函数表&对象模型
- HDU 1160 FatMouse's Speed 最长上升子序列,重拾DP
- Unity后期处理-抗锯齿
- oracle awr报告
- jvm
- Ruby On Rails--Action Controller(控制器)