思路:按照题目的意思见图,然后就是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 */