mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
92 lines
1.8 KiB
C++
92 lines
1.8 KiB
C++
#include <cstdio>
|
|
#include <queue>
|
|
#include <algorithm>
|
|
using namespace std;
|
|
const int inf = 1000000000;
|
|
int map[1010][1010];
|
|
int n, p;
|
|
bool flag[1010];
|
|
int dis[1010];
|
|
void spfa()
|
|
{
|
|
for(int i = 1; i <= n ;++i)
|
|
{
|
|
flag[i] = false;
|
|
dis[i] = inf;
|
|
}
|
|
dis[2] = 0;
|
|
flag[2] = true;
|
|
queue<int> que;
|
|
que.push(2);
|
|
while(!que.empty())
|
|
{
|
|
int now = que.front();
|
|
que.pop();
|
|
flag[now] = false;
|
|
for(int i = 1; i <= n ;++i)
|
|
{
|
|
if(dis[i] > dis[now] + map[now][i])
|
|
{
|
|
dis[i] = dis[now] + map[now][i];
|
|
if(!flag[i])
|
|
{
|
|
flag[i] = true;
|
|
que.push(i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
int cou[1010];
|
|
void dfs(int now)
|
|
{
|
|
if(now == 2)
|
|
{
|
|
cou[2] = 1;
|
|
return;
|
|
}
|
|
int result(0);
|
|
for(int i = 1; i <= n ;++i)
|
|
{
|
|
if(map[now][i] != inf && dis[i] < dis[now])
|
|
{
|
|
if(cou[i] >= 0)
|
|
{
|
|
result += cou[i];
|
|
}
|
|
else
|
|
{
|
|
dfs(i);
|
|
result += cou[i];
|
|
}
|
|
}
|
|
}
|
|
cou[now] = result;
|
|
}
|
|
int main()
|
|
{
|
|
int a, b, dist;
|
|
while(scanf("%d", &n) != EOF)
|
|
{
|
|
if(!n)
|
|
break;
|
|
scanf("%d", &p);
|
|
for(int i = 0; i <= n; ++i)
|
|
for(int j = 1; j <= n;++j)
|
|
map[i][j] = inf;
|
|
for(int i= 0; i < p; ++i)
|
|
{
|
|
scanf("%d %d %d", &a, &b, &dist);
|
|
map[a][b] = map[b][a] = dist;
|
|
}
|
|
spfa();
|
|
for(int i = 1; i <= n;++i)
|
|
{
|
|
cou[i] = -1;
|
|
}
|
|
dfs(1);
|
|
printf("%d\n", cou[1]);
|
|
}
|
|
return 0;
|
|
}
|