题意:有n个节点,m条路,每条路都有一定的长度,求从节点1到节点2最短距离的种数。
链接:http://acm.hdu.edu.cn/showproblem.php?pid=1142
思路:最短路径+记忆化搜索,先从终点求终点到每个点的最短路,在从起点开始记忆化搜索,求路径数量
注意点:不能一边求最短路,一边记录路径数,可能会有重复记录路径可能
以下为AC代码:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
12838372 | 2015-01-29 14:05:25 | Accepted | 1142 | 78MS | 2172K | 2368 B | G++ | luminous11 |
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double pi = acos(-1);
const int maxn = 1005;
vector< pair<int, int> > g[maxn];
int dis[maxn];
int cnt[maxn];
void SPFA ( int n )
{
bool v[maxn] = { 0 };
queue<int> q;
q.push( 2 );
v[2] = true;
dis[2] = 0;
//cnt[1] = 1;
while ( ! q.empty() ){
int k = q.front();
q.pop();
for ( int i = 0; i < g[k].size(); i ++ ){
if ( dis[k] + g[k][i].second < dis[g[k][i].first] ){
dis[g[k][i].first] = dis[k] + g[k][i].second;
q.push( g[k][i].first );
}
}
}
}
int dfs ( int k )
{
if ( k == 2 ) return 1;
if ( cnt[k] ) return cnt[k];
for ( int i = 0; i < g[k].size(); i ++ ){
if ( dis[k] > dis[g[k][i].first] ){
cnt[k] += dfs ( g[k][i].first );
}
}
return cnt[k];
}
int main()
{
ios::sync_with_stdio( false );
int m, n;
while ( cin >> n >> m ){
for ( int i = 0; i < maxn; i ++ )g[i].clear();
int a, b, d;
clr ( dis, 0x3f3f3f3f );
clr ( cnt, 0 );
for ( int i = 0; i < m; i ++ ){
cin >> a >> b >> d;
g[a].pb( make_pair( b, d ) );
g[b].pb( make_pair( a, d ) );
}
/* for ( int i = 0; i <= n; i ++ ){
cout << i << ": ";
for ( int j = 0; j < g[i].size(); j ++ ){
cout << g[i][j].first << '(' << g[i][j].second << ')' << ' ';
}
cout << endl;
}*/
SPFA ( n );
/* for ( int i = 0; i <= n; i ++ ){
cout << i << ' ' << dis[i] << ' ' << cnt[i] << endl;
}*/
cout << dfs(1) << endl;
}
return 0;
}