uva10917.cppWalk Through the Forest

思路:按照题目的意思见图,然后就是DAG图上的记忆化搜索。

// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <limits.h>
// #define DEBUG
#ifdef DEBUG
#define debug(...) printf( __VA_ARGS__ )
#else
#define debug(...)
#endif
#define MEM(x,y) memset(x, y,sizeof x)
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> ii;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int maxn = 1010;
struct Heap{
	int u, dis;
	Heap(int u,int dis){
		this->dis = dis;
		this->u = u;
	}
	bool operator < (const Heap& rhs)const{
		return this->dis > rhs.dis;
	}
};
struct Edge{
	int v, w, nxt;
}E[maxn * 300];
int head[maxn];
int cnt;
void Init(){
	MEM(head, -1);
	cnt = 0;
}
void add(int u,int v,int w){
	E[cnt].v = v;
	E[cnt].w = w;
	E[cnt].nxt = head[u];
	head[u] = cnt++;
}

bool vis[maxn];
int dis[maxn], pre[maxn];
void Dijkstra(int st){
	MEM(vis, false);
	MEM(dis, INF);
	priority_queue<Heap> que;
	que.push(Heap(st, 0));
	dis[st] = 0;
	pre[st] = -1;
	while(!que.empty()){
		Heap now = que.top();
		que.pop();
		if (vis[now.u]) continue;
		vis[now.u] = true;
		for (int i = head[now.u];i != -1;i = E[i].nxt){
			int v = E[i].v;
			if (dis[v] > dis[now.u] + E[i].w){
				dis[v] = dis[now.u] + E[i].w;
				que.push(Heap(v, dis[v]));
				pre[v] = now.u;
			}
		}
	}
}
int dp[maxn];
int dfs(int u,int fa){
	if (dp[u] != -1) return dp[u];
	int res = 0;
	for (int i = head[u];i != -1;i = E[i].nxt){
		int v = E[i].v;
		if (dis[u] > dis[v] && v != fa)
			res += dfs(v, u);
	}
	return dp[u] = res;
}
int main()
{	
	// freopen("in.txt","r",stdin);
	// freopen("out.txt","w",stdout);
	int n, m;
	while(scanf("%d",&n) != EOF && n){
		Init();
		cin >> m;
		int a, b, c;
		for (int i = 1;i <= m;++i){
			scanf("%d%d%d",&a, &b, &c);
			add(a, b, c);
			add(b, a, c);
		}
		// cout << n << endl;
		Dijkstra(2);
		// for (int i = 1;i <= n;++i)
		// 	printf("(%d, %d)\n",i,dis[i]);
		MEM(dp, -1);
		dp[2] = 1;
		dfs(1, -1);
		printf("%d\n", dp[1]);
	}
	return 0;
}
/*
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
*/


你可能感兴趣的:(最短路,uva,DAG记忆化搜索)