这道题因为英语渣半天没看懂题意,后来在网上找了一些题解发现,好多人题意理解错了,但是代码交上去能过。
最后终于找到了一个能说明白的题解。
链接:http://www.cnblogs.com/ruihua852/archive/2012/08/27/2658910.html
下面是粘贴的链接中的题意:
题目意思是说一个人要从上班的地方回到家里,途中会经过一些地方,按下面规则问他回家会有几种路线:
题目已经定义好1为上班地方2为家,每个地点之间的距离都已经知道,哪么如果从A到B的一条路,可以走的条件
是B到2(家)的路程必须小于从A到2(家)的路程,其实就是A到家的最短路径必须大于B到家的最短路径。
默认一定可以走到家,也就是一定会有一种路线。最后是让你计算有几种路线。
下面是我自己的代码。链接中的题解使用dijkstra,而我用了spfa,因为spfa用得少,就想熟悉一下。
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
#include <memory.h>
#define INF 10000000
using namespace std;
struct node
{
int e,w;
node(int ee,int ww):e(ee),w(ww){}
node(){}
};
int dp[1005];
vector<vector<node> > v;
int dist[1005];
int N,M;
void spfa(int S)
{
for(int i=1;i<=N;i++)
{
dist[i]=INF;
}
dist[S]=0;
queue<int> Q;
Q.push(S);
while(!Q.empty())
{
int s=Q.front();
Q.pop();
for(int i=0;i<v[s].size();i++)
{
int e=v[s][i].e;
if(dist[s]+v[s][i].w<dist[e])
{
dist[e]=dist[s]+v[s][i].w;
Q.push(e);
}
}
}
}
int DFS(int S)
{
if(dp[S])
return dp[S];
if(S==2)
return 1;
for(int i=0;i<v[S].size();i++)
{
if(dist[v[S][i].e]<dist[S])
dp[S]+=DFS(v[S][i].e);
}
return dp[S];
}
int main()
{
int a,b,c;
while(scanf("%d",&N)&&N)
{
v.clear();
v.resize(N+1);
memset(dp,0,sizeof(dp));
scanf("%d",&M);
while(M--)
{
scanf("%d%d%d",&a,&b,&c);
v[a].push_back(node(b,c));
v[b].push_back(node(a,c));
}
spfa(2);
cout<<DFS(1)<<endl;
}
return 0;
}
原文:http://www.cnblogs.com/modengdubai/p/4742283.html