uva10986 优先队列优化的Dijkstra

题意:

求最短路

思路:

这里用到了邻接表来存储,由于n太大了,然后还用了优先队列来优化,每次都输出里面的最短边,如果这个点的最短边已经考虑过了自然就不会考虑,然后每纳入一个点(就是优先队列里出来的未考虑的点)就重新调整每个点到原点的距离, 所有调整过的点都重新入队

代码:

#include
#include
#include
#include
using std::make_pair;
using namespace std;
typedef pair pii;
const int N = 400005;
const int M = 400005;
const int INF = 0x3f3f3f3f;
int first[N];
int vis[N];
int u[M], v[M], w[M], nex[M];
int dis[N];
int n, m, s, t;
priority_queue, greater >q;

void build() {
	scanf("%d%d%d%d", &n, &m, &s, &t);
	for(int i=0; i dis[x]+w[i]) {
				dis[v[i]] = dis[x]+w[i];
				q.push(make_pair(dis[v[i]], v[i]));
			}
		}
	}
}
int main () {  
    int cas = 1;  
    int tt;  
    scanf("%d", &tt);    
    while (tt--) {    
        build();    
        dij();    
        printf("Case #%d: ", cas++);    
        if (dis[t] == INF)    
            printf("unreachable\n");    
        else    
            printf("%d\n", dis[t]);    
    }    
    return 0;    
}  



你可能感兴趣的:(栈与队列,图,Dijkstra)