hdu 1142 记忆化搜索 dijkstra

遇到了不少问题

下面是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);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值