标签:hdu1548 a strange lift dijkstra spfa 最短路
5 1 5 3 3 1 2 5 0
3
#include <cstdio> #include <deque> #define MAX 210 #define INF 1000000000 using namespace std ; int graph[MAX][MAX] ; int t[MAX] ; bool visited[MAX] ; int SPFA(int s , int d , int n) { int dis[MAX] , c[MAX]; for(int i = 1 ; i <= n ; ++i) { dis[i] = INF ; c[i] = 0 ; visited[i] = false ; } dis[s] = 0 ; deque<int> que ; que.push_front(s) ; while(!que.empty()) { int k = que.front() ; que.pop_front() ; visited[k] = false ; c[k]++ ; if(c[k]>n) { return -1 ; } for(int i = 1 ; i <= n ; ++i) { if(dis[i]>dis[k]+graph[k][i]) { dis[i] = dis[k]+graph[k][i] ; visited[i] = true ; if(!que.empty()) { if(que.front()<=dis[i]) que.push_back(i) ; else que.push_front(i) ; } else { que.push_front(i) ; } } } } return dis[d] ; } int main() { int n , a , b ; while(~scanf("%d",&n) && n) { scanf("%d%d",&a,&b) ; for(int i = 1 ; i <= n ; ++i) { scanf("%d",&t[i]) ; } for(int i = 0 ; i <= n ; ++i) { for(int j = 0 ; j <= n ; ++j) { graph[i][j] = INF ; } } for(int i = 1 ; i <= n ; ++i) { if(i+t[i]<=n) { graph[i][i+t[i]] = 1 ; } if(i-t[i]>0) { graph[i][i-t[i]] = 1 ; } } if(b<1|b>n) { puts("-1") ; continue ; } int ans = SPFA(a,b,n) ; if(ans >= INF) puts("-1") ; else printf("%d\n",ans) ; } return 0 ; }
#include <stdio.h> #define MAX 210 #define INF 1000000000 int graph[MAX][MAX] ; int t[MAX] , dis[MAX]; bool visited[MAX] ; void dijkstra(int s , int n) { for(int i = 1 ; i <= n ; ++i) { dis[i] = graph[s][i] ; visited[i] = false ; } dis[s] = 0 ; //忘了写这行代码。。让我wrong成SB了 visited[s] = true ; for(int i = 1 ; i < n ; ++i) { int index = -1 , min = INF; for(int j = 1 ; j <= n ; ++j) { if(!visited[j] && dis[j]<min) { index = j ; min = dis[j] ; } } if(index == -1) { return ; } visited[index] = true ; for(int j = 1 ; j <= n ; ++j) { if(!visited[j] && dis[j]>dis[index]+graph[index][j]) { dis[j] = dis[index]+graph[index][j] ; } } } } int main() { int n , a , b ; while(~scanf("%d",&n) && n) { scanf("%d%d",&a,&b) ; for(int i = 1 ; i <= n ; ++i) { scanf("%d",&t[i]) ; } for(int i = 0 ; i <= n ; ++i) { for(int j = 0 ; j <= n ; ++j) { graph[i][j] = INF ; } } for(int i = 1 ; i <= n ; ++i) { if(i+t[i]<=n) { graph[i][i+t[i]] = 1 ; } if(i-t[i]>0) { graph[i][i-t[i]] = 1 ; } } if(b<1|b>n) { puts("-1") ; continue ; } dijkstra(a,n) ; if(dis[b] >= INF) puts("-1") ; else printf("%d\n",dis[b]) ; } return 0 ; }
hdu 1548 A strange lift Dijkstra+SPFA算法AC
标签:hdu1548 a strange lift dijkstra spfa 最短路
原文地址:http://blog.csdn.net/lionel_d/article/details/44701901