跟hdu 1428题目雷同,算法也雷同。依旧是先用spfa算法算出个点到终点的距离,然后再进行一遍搜索。
不过我spfa写得还是突出一个弱。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define N 1005
#define inf 0x3f3f3f3f
int map[N][N],dis[N],dp[N],vis[N];
int n,m;
void spfa()
{
queue<int> Q;
dis[2] = 0;
vis[2] = true;
Q.push(2);
while (!Q.empty())
{
int temp = Q.front();
Q.pop();
for (int i=1; i<=n; ++i)
{
if (dis[temp] + map[temp][i] < dis[i])
{
dis[i] = dis[temp] + map[temp][i];
if (!vis[i])
{
Q.push(i);
vis[i] = true;
}
}
}
vis[temp] = false;
}
}
int dfs(int x)
{
if(x==2) return 1;
if(dp[x]>0) return dp[x];
for(int i=1; i<=n; i++)
{
if(i==x) continue;
if(dis[i]<dis[x]&&map[x][i]!=inf)
{
dp[x]+=dfs(i);
}
}
return dp[x];
}
int main()
{
while(scanf("%d",&n),n)
{
scanf("%d",&m);
memset(map,0x3f,sizeof(map));
for(int i=1; i<=m; i++)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
map[x][y]=map[y][x]=k;
}
memset(dis,0x3f,sizeof(dis));
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
spfa();
dfs(1);
printf("%d\n",dp[1]);
}
return 0;
}