题意:
电梯, 在第 i 层只能向上或向下走 ki 步, 问从 A 层到 B 层最少走多少步.
思路:
有向图求最短路. 用Dijkstra, 都是正权值.
注意:
vector要清空 ! ! ! [ 泪目]
#include#include #include using namespace std; const int MAXN = 205; const int INF = 0x3f3f3f3f; vector edge[MAXN]; int n,d[MAXN]; bool vis[MAXN]; int Dijkstra(int s, int t)//加了许多特判.. { if(t>n||s>n) return -1; if(t==s) return 0; memset(d,0x3f,sizeof(d)); memset(vis,false,sizeof(vis)); d[s] = 0; for(int i=0;i d[k]+1) d[v] = d[k] + 1; } } } int main() { while(scanf("%d",&n) && n) { int a,b; scanf("%d %d",&a,&b); for(int i=1;i<=n;i++) { int k,up,down; scanf("%d",&k); edge[i].clear();///坑啊~~~为什么codeblocks调试的时候没异常呢 > < if(!k) continue; if((up = i+k)<=n) edge[i].push_back(up); if((down = i-k)>=1) edge[i].push_back(down); } printf("%d\n",Dijkstra(a,b)); } } #include #include #include using namespace std; const int MAXN = 205; const int INF = 0x3f3f3f3f; vector edge[MAXN]; int n,d[MAXN]; bool vis[MAXN]; int Dijkstra(int s, int t)//加了许多特判.. { if(t>n||s>n) return -1; if(t==s) return 0; memset(d,0x3f,sizeof(d)); memset(vis,false,sizeof(vis)); d[s] = 0; for(int i=0;i d[k]+1) d[v] = d[k] + 1; } } } int main() { while(scanf("%d",&n) && n) { int a,b; scanf("%d %d",&a,&b); for(int i=1;i<=n;i++) { int k,up,down; scanf("%d",&k); edge[i].clear();///坑啊~~~为什么codeblocks调试的时候没异常呢 > < if(!k) continue; if((up = i+k)<=n) edge[i].push_back(up); if((down = i-k)>=1) edge[i].push_back(down); } printf("%d\n",Dijkstra(a,b)); } }
另附Dijkstra模板:
#include#include #include #include #include using namespace std; #define N 1002 #define inf 0x3f3f3f3f struct node { int v, w; node() {} node(int _v, int _w):v(_v), w(_w) {} }; vector g[N]; int n, m, d[N]; bool vis[N]; int Dijkstra(int s, int t) { memset(d, 0x3f, sizeof(d)); memset(vis, false, sizeof(vis)); d[s] = 0; for (int i=0; i d[k] + w) d[v] = d[k] + w; } } return d[t]; } int main() { while (scanf("%d%d", &n, &m) == 2) { for (int i=0; i<=n; i++) g[i].clear(); for (int i=0, a, b, c; i