您的位置:首页 > 其它

hdu 1142 记忆化搜索 dijkstra

2015-11-28 16:35 381 查看
遇到了不少问题

下面是AC的代码,这几个问题有人也遇到的或者知道为什么的留言告诉下


#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <string.h>
#define inf 99999999
using namespace std;
int n,m,map[1505][1505],dp[1505],dis[1505];
bool vis[1505];
void init()
{
int i,j;
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
if(j == i) map[i][j] = 0;
else map[i][j] = inf;
}
}
}
void dijkstra(int v0)
{
int i,j,u;
vis[v0] = 1;
for(i = 1; i <= n; i++) dis[i] = map[v0][i];
for(i = 1; i < n; i++)
{
int minn = inf,u;
for(j = 1; j <= n; j++)
{
if(!vis[j] && dis[j] < minn)
{
minn = dis[j];
u = j;
}
}
if(minn == inf) return;//不知道为什么这句没有就 会数组越界
vis[u] = 1;
for(j = 1; j <= n; j++)
{
if(!vis[j] && map[u][j] < inf &&dis[j] > dis[u] + map[u][j])
dis[j] = dis[u] + map[u][j];
}
}
}
int dfs(int v)
{
if(v == 2) return 1;//修改
if(dp[v]) return dp[v];
int i,j;
for(i = 1; i <= n; i++)
{
if(map[i][v] < inf && dis[i] < dis[v]) dp[v]+=dfs(i);//修改
}
return dp[v];
}
int main()
{
//	freopen("t.txt","r",stdin);
int i,j,p,q,r;
while(~scanf("%d",&n) && n)
{
scanf("%d",&m);
init();

for(i = 0; i < m; i++)
{
scanf("%d%d%d",&p,&q,&r);
if(map[p][q] >= r)
map[p][q] = map[q][p] = r;
}

dijkstra(2);
int count = dfs(1);//不知道为什么从2作为起点搜就会错(从2开始搜的时候上面标记修改的地方也改了)
printf("%d\n",count);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: