您的位置:首页 > 其它

hdu1142(最短路+记忆化搜索)

2015-06-10 20:24 399 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1142

题目意思挺模糊

大致思路,以终点为源点,做一次单源最短路

深搜一遍图(下一步到达的位置 比现在位置 离终点更近)

记录每个节点上可行数

#include <bits/stdc++.h>

struct Edge
{
int v, w;
Edge(int _v, int _w): v(_v), w(_w){}
};

const int MAXN = 1000 + 10;

std::vector<Edge> E[MAXN];

int n, m, dp[MAXN];

bool vis[MAXN];
int dist[MAXN];

void init()
{
memset(vis, false, sizeof(vis));
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; ++ i){
dist[i] = 1<<30;
E[i].clear();
}
}

void addEdge(int a, int b, int d)
{
E[a].push_back(Edge(b, d));
E[b].push_back(Edge(a, d));
}

void spfa(int start)
{
vis[start] = true;
dist[start] = 0;
std::queue<int> que;
que.push(start);
while(que.empty()==false){
int u = que.front();
que.pop();
vis[u] = false;
for(int i = 0; i < E[u].size(); ++ i){
int v = E[u][i].v;
int w = E[u][i].w;
if(dist[v] > dist[u] + w){
dist[v] = dist[u] + w;
if(vis[v] == false){
que.push(v);
}
}
}
}
}

int dfs(int u)
{
if(u == 2)
return 1;
if(dp[u] > 0){
return dp[u];
}
for(int i = 0; i < E[u].size(); ++ i){
int v = E[u][i].v;
if(dist[u] > dist[v]){
dp[u] += dfs(v);
}
}
return dp[u];
}

int main()
{
while(scanf("%d", &n) && n){
scanf("%d", &m);
init();
for(int i = 1; i <= m; ++ i){
int a, b, d;
scanf("%d%d%d", &a, &b, &d);
addEdge(a, b, d);
}
spfa(2);
printf("%d\n", dfs(1));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: