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