本文整理汇总了C++中Dijkstra::init方法的典型用法代码示例。如果您正苦于以下问题:C++ Dijkstra::init方法的具体用法?C++ Dijkstra::init怎么用?C++ Dijkstra::init使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Dijkstra
的用法示例。
在下文中一共展示了Dijkstra::init方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: main
int main() {
int r1, c1, r2, c2, kase = 0;
while(scanf("%d%d%d%d%d%d", &R, &C, &r1, &c1, &r2, &c2) == 6 && R) {
r1--; c1--; r2--; c2--;
for(int r = 0; r < R; r++) {
for(int c = 0; c < C-1; c++)
grid[r][c][RIGHT] = grid[r][c+1][LEFT] = readint();
if(r != R-1) for(int c = 0; c < C; c++)
grid[r][c][DOWN] = grid[r+1][c][UP] = readint();
}
solver.init(R*C*5+1);
n = 0;
memset(id, 0, sizeof(id));
// 源点出发的边
for(int dir = 0; dir < 4; dir++) if(cango(r1, c1, dir)) {
solver.AddEdge(0, ID(r1+dr[dir], c1+dc[dir], dir), grid[r1][c1][dir]*2); // 开始走下去
solver.AddEdge(0, ID(r1+dr[dir], c1+dc[dir], 4), grid[r1][c1][dir]*2); // 走一步停下来
}
// 计算每个状态(r,c,dir)的后继状态
for(int r = 0; r < R; r++)
for(int c = 0; c < C; c++) {
for(int dir = 0; dir < 4; dir++) if(cango(r, c, inv[dir])) {
solver.AddEdge(ID(r, c, dir), ID(r, c, 4), grid[r][c][inv[dir]]); // 停下来!
if(cango(r, c, dir))
solver.AddEdge(ID(r, c, dir), ID(r+dr[dir], c+dc[dir], dir), grid[r][c][dir]); // 继续走
}
for(int dir = 0; dir < 4; dir++) if(cango(r, c, dir)) {
solver.AddEdge(ID(r, c, 4), ID(r+dr[dir], c+dc[dir], dir), grid[r][c][dir]*2); // 重新开始走
solver.AddEdge(ID(r, c, 4), ID(r+dr[dir], c+dc[dir], 4), grid[r][c][dir]*2); // 走一步停下来
}
}
// 跑dijkstra
solver.dijkstra(0);
// 找最优解
int ans = solver.d[ID(r2, c2, 4)];
printf("Case %d: ", ++kase);
if(ans == INF) printf("Impossible\n"); else printf("%d\n", ans);
}
return 0;
}
示例2: main
int main() {
int kase = 0, N, S, E, M, K, X, Y, Z;
while(scanf("%d%d%d%d", &N, &S, &E, &M) == 4) {
solver.init(N);
S--; E--; // 编号从0~N-1
for(int i = 0; i < M; i++) {
scanf("%d%d%d", &X, &Y, &Z); X--; Y--;
solver.AddEdge(X, Y, Z);
solver.AddEdge(Y, X, Z);
}
solver.GetShortestPaths(S, d1, paths1); // S到所有点的距离和路径
solver.GetShortestPaths(E, d2, paths2); // T到所有点的距离和路径
int ans = d1[E]; // 初始解解为直达距离
vector<int> path = paths1[E]; // 初始解的station序列
int midpoint = -1; // 不坐商业线
scanf("%d", &K);
for(int i = 0; i < K; i++) {
scanf("%d%d%d", &X, &Y, &Z); X--; Y--;
for(int j = 0; j < 2; j++) { // j=0代表商业线坐X->Y,j=1代表Y->X
if(d1[X] + d2[Y] + Z < ans) {
ans = d1[X] + d2[Y] + Z;
path = paths1[X];
for(int j = paths2[Y].size()-1; j >= 0; j--) // 从Y到T的距离要反过来
path.push_back(paths2[Y][j]);
midpoint = X;
}
swap(X, Y);
}
}
if(kase != 0) printf("\n");
kase++;
for(int i = 0; i < path.size()-1; i++) printf("%d ", path[i]+1);
printf("%d\n", E+1);
if(midpoint == -1) printf("Ticket Not Used\n"); else printf("%d\n", midpoint+1);
printf("%d\n", ans);
}
return 0;
}
示例3: main
int main()
{
int n, m;
while(scanf("%d%d", &n, &m) == 2)
{
solver.init(n);
for(int i = 0; i < m; ++i)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c); --a; --b;
solver.AddEdge(a, b, c);
solver.AddEdge(b, a, c);
}
solver.dijkstra(1); // 家(1)到所有点的距离。因为道路都是双向的,所以把家看作起点也行
memset(d, -1, sizeof(d));
printf("%d\n", dp(0)); // 办公室(0)到家的符合条件的路径条数
}
return 0;
}
示例4: main
int main()
{
int t;
scanf("%d",&t);
for(int i = 1;i <= t;i ++)
{
memset(edges,0,sizeof(edges));
memset(next,0,sizeof(next));
memset(head,0,sizeof(head));
maps.clear();
int tott = 0;
tot = 0;
scanf("%d",&n);
dijkstra.init(n);
for(int i = 1;i <= n;i ++)
{
string s1;
int ct;
cin>>s1;
maps[s1] = ++tott;
scanf("%d",&ct);
for(int i = 1;i <= ct;i ++)
{
int a,b;
scanf("%d%d",&a,&b);
build(maps[s1],a,b);
}
}
int q;
scanf("%d",&q);
string s1,s2;
for(int i = 1;i <= q;i ++)
{
cin>>s1>>s2;
dijkstra.dijkstra(maps[s1]);
printf("%d\n",dijkstra.d[maps[s2]]);
}
}
return 0;
}
示例5: main
int main(int argc, char const *argv[])
{
READ;
WRITE;
read();
Dijkstra dijkstra;
dijkstra.init();
for(int i = 0 ; i < 300 ; i ++)
{
for(int j = 0 ; j < 300 ; j++)
{
if(g[i][j]!=-1)
{
// printf("* %c %c %d\n",i,j,g[i][j]);
dijkstra.AddEdge(i, j, g[i][j]);
}
}
}
dijkstra.dijkstra('Z');
return 0;
}