标签:
这道题因为英语渣半天没看懂题意,后来在网上找了一些题解发现,好多人题意理解错了,但是代码交上去能过。
最后终于找到了一个能说明白的题解。
链接: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