5 6 1 3 2 1 4 2 3 4 3 1 5 12 4 2 34 5 2 24 7 8 1 3 1 1 4 1 3 7 1 7 4 1 7 5 1 6 7 1 5 2 1 6 2 1 0
2 4
#include <stdio.h>
#include <string.h>
#include <queue>
#define maxn 1002
#define inf 0x3f3f3f3f
using std::queue;
int map[maxn][maxn];
int dist[maxn], dp[maxn];
bool vis[maxn];
void SPFA(int s, int n)
{
int i, u, tmp;
for(i = 0; i <= n; ++i){
dist[i] = inf; vis[i] = false;
}
queue<int> Q;
u = s; vis[u] = 1; dist[u] = 0;
Q.push(u);
while(!Q.empty()){
u = Q.front(); Q.pop();
vis[u] = false;
for(i = 1; i <= n; ++i){
if(map[u][i] == inf) continue;
tmp = map[u][i] + dist[u];
if(tmp < dist[i]){
dist[i] = tmp;
vis[i] = true;
Q.push(i);
}
}
}
}
int DFS(int s, int n)
{
if(dp[s]) return dp[s];
if(s == 2) return 1;
int i, ans = 0;
for(i = 1; i <= n; ++i)
if(map[s][i] != inf && dist[i] < dist[s]){
ans += DFS(i, n);
}
return dp[s] = ans;
}
int main()
{
int n, m, u, v, d, i, j;
while(scanf("%d%d", &n, &m) == 2){
for(i = 0; i <= n; ++i){
for(j = 0; j <= n; ++j)
map[i][j] = inf;
map[i][i] = 0;
}
for(i = 0; i < m; ++i){
scanf("%d%d%d", &u, &v, &d);
map[u][v] = map[v][u] = d;
}
SPFA(2, n);
for(i = 0; i <= n; ++i) dp[i] = 0;
printf("%d\n", DFS(1, n));
}
return 0;
}Dijkstra 实现:
#include <stdio.h>
#include <string.h>
#define maxn 1002
#define inf 0x3f3f3f3f
int map[maxn][maxn];
int dist[maxn], dp[maxn];
bool vis[maxn];
int getNext(int n)
{
int u = -1, tmp = inf, i;
for(i = 1; i <= n; ++i)
if(!vis[i] && tmp > dist[i]){
tmp = dist[i]; u = i;
}
return u;
}
void Dijkstra(int s, int n)
{
int i, u, tmp;
for(i = 0; i <= n; ++i){
dist[i] = inf; vis[i] = false;
}
u = s; dist[u] = 0;
while(u != -1){
for(i = 1; i <= n; ++i){
if(map[u][i] == inf) continue;
tmp = map[u][i] + dist[u];
if(tmp < dist[i]) dist[i] = tmp;
}
vis[u] = true;
u = getNext(n);
}
}
int DFS(int s, int n)
{
if(dp[s]) return dp[s];
if(s == 2) return 1;
int i, ans = 0;
for(i = 1; i <= n; ++i)
if(map[s][i] != inf && dist[i] < dist[s]){
ans += DFS(i, n);
}
return dp[s] = ans;
}
int main()
{
int n, m, u, v, d, i, j;
while(scanf("%d%d", &n, &m) == 2){
for(i = 0; i <= n; ++i){
for(j = 0; j <= n; ++j)
map[i][j] = inf;
map[i][i] = 0;
}
for(i = 0; i < m; ++i){
scanf("%d%d%d", &u, &v, &d);
map[u][v] = map[v][u] = d;
}
Dijkstra(2, n);
for(i = 0; i <= n; ++i) dp[i] = 0;
printf("%d\n", DFS(1, n));
}
return 0;
}HDU1142 A Walk Through the Forest 【SPFA】+【记忆化搜索】,布布扣,bubuko.com
HDU1142 A Walk Through the Forest 【SPFA】+【记忆化搜索】
原文:http://blog.csdn.net/chang_mu/article/details/38554347