专题四 · 1010
Posted suamfadmp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了专题四 · 1010相关的知识,希望对你有一定的参考价值。
代码及解释
#include <stdio.h>
#include <iostream>
#include <queue>
// 最短路之后深搜
// 用的队列优化
//
//
typedef struct n1 int distens, flog; node;
node N[1005];
int map[1005][1005], k;
int direct[1005];
void set(int n)
int i, j, m, n1, n2, d;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
map[i][j] = -1;
N[i].distens = 10000000;
N[i].flog = 0;
direct[i] = 0;
scanf("%d", &m);
while (m--)
scanf("%d%d%d", &n1, &n2, &d);
if (map[n1][n2] != 0 || map[n1][n2] > d)
map[n1][n2] = map[n2][n1] = d;
void spfa(int n)
std::queue<int> Q;
int now;
int i;
N[2].distens = 0;
N[2].flog = 1;
Q.push(2);
while (!Q.empty())
now = Q.front();
Q.pop();
N[now].flog = 0;
for (i = 1; i <= n; i++)
if (map[now][i] != -1)
if (N[i].distens > N[now].distens + map[now][i])
N[i].distens = N[now].distens + map[now][i];
if (N[i].flog == 0)
N[i].flog = 1;
Q.push(i);
int DFS(int now, int n)
int i;
if (direct[now] > 0)
return direct[now];
if (now == 2)
return 1;
for (i = 1; i <= n; i++)
if (map[now][i] != -1 && N[now].distens > N[i].distens)
direct[now] += DFS(i, n);
return direct[now];
int main()
int n;
while (scanf("%d", &n) > 0 && n)
set(n);
spfa(n);
k = DFS(1, n);
printf("%d\\n", k);
以上是关于专题四 · 1010的主要内容,如果未能解决你的问题,请参考以下文章
kuangbin专题专题四 MPI Maelstrom POJ - 1502