POJ2449 Remmarguts' Date

題目連接:http://poj.org/problem?id=2449ios

題目描述:ui

  其實題目的大意就是求 第k短路, 存在就輸出, 不存在就輸出-1。 注意當起點和終點一致的時候,須要k++, 由於在OUTPUT時提到the length (time required) to welcome Princess Uyuw using the K-th shortest path。 能夠看出是須要時間的,而且並無描述相同點直接的時間爲0這一條件,所以在計算路徑的時候,爲0的路徑是不可以算到裏面的; 而求最短路的時候會計算一次,所以須要k++。spa

  通常就是使用最短路+A*進行處理,A*能夠直接使用優先隊列進行維護便可。由於SPFA寫殘了, 調了很久。。。。、code

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<queue>
 5 #include<vector>
 6 using namespace std ;  7 /*
 8 題意就是求s->t 的第k短路, SPFA+A*  9 SPFA寫殘了,調了很久~~~~  10 */
 11 //  12 const int MAX_NODE = 1005 ;  13 const int MAX_EDGE = 1e5 + 5 ;  14 const int INF = 1e7 ;  15 int to[MAX_EDGE], next[MAX_EDGE], weight[MAX_EDGE], head[MAX_NODE] ;  16 int dis[MAX_NODE] ;  17 int edgeNum, s, t, k, n, m ;  18 int ff[MAX_EDGE], tt[MAX_EDGE], ww[MAX_EDGE] ;  19 queue <int> qu ;  20 bool vis[MAX_NODE] ;  21 //  22 void clear(){  23     edgeNum = 0 ;  24     for( int i = 0; i < MAX_NODE; i++ ){  25         head[i] = -1 ;  26  }  27 }  28 //  29 void addEdge(int u, int v, int w){  30     to[edgeNum] = v ;  31     weight[edgeNum] = w ;  32     next[edgeNum] = head[u] ;  33     head[u] = edgeNum++ ;  34 }  35 //  36 void SPFA(){  37     for( int i = 0; i <= n; i++ ){  38         dis[i] = INF ;  39         vis[i] = false ;  40  }  41     //cout << dis[n] << " " << vis[n] << endl ;
 42     while( !qu.empty() ) qu.pop() ;  43  qu.push(t) ;  44     vis[t] = true ;  45     dis[t] = 0 ;  46     while( !qu.empty() ){  47         int u = qu.front() ;  48  qu.pop() ;  49         vis[u] = false ;  50         for( int edge = head[u]; edge != -1; edge = next[edge] ){  51             if( dis[to[edge]] > dis[u]+weight[edge] ){  52                 dis[to[edge]] = dis[u] + weight[edge] ;  53                 if( !vis[to[edge]] ){  54  qu.push(to[edge]) ;  55                     vis[to[edge]] = true ;  56  }  57  }  58  }  59  }  60 }  61 //  62 int solve(){  63  clear() ;  64     for( int i = 0; i < m; i++ ){  65  addEdge(tt[i], ff[i], ww[i]) ;  66  }  67  SPFA() ;  68  clear() ;  69     for( int i = 0; i < m; i++ ){  70  addEdge(ff[i], tt[i], ww[i]) ;  71  }  72     if( dis[s] == INF )    return -1 ;  73     priority_queue < pair<int, int> > heap ;  74     while( !heap.empty() ) heap.pop() ;  75     heap.push(make_pair(-dis[s], s)) ;  76     while( !heap.empty() ){  77         int val = heap.top().first ;  78         int u = heap.top().second ;  79         int res = -val - dis[u] ;  80  heap.pop() ;  81         if( u == t ){  82             if( !--k ){  83                 return res ;  84  }  85  }  86         for( int edge = head[u]; edge != -1; edge = next[edge] ){  87             heap.push(make_pair(-(res+weight[edge]+dis[to[edge]]), to[edge])) ;  88  }  89  }  90     return -1 ;  91 }  92 //  93 int main(){  94     //freopen("1234.txt", "r", stdin) ;
 95     scanf("%d%d", &n, &m) ;  96     int a, b, c ;  97     for( int i = 0; i < m; i++ ){  98         scanf("%d%d%d", &a, &b, &c) ;  99         ff[i] = a ;    tt[i] = b ; ww[i] = c ; 100  } 101     scanf("%d%d%d", &s, &t, &k) ; 102     if( s == t )    k++ ; 103     cout << solve() << endl ; 104     return 0 ; 105 }
相關文章
相關標籤/搜索