1003. Emergency (25)

1003. Emergency (25)

此博文转自http://blog.csdn.net/iaccepted/article/details/21451949
本文主要更改了其表述、注释、变量命名。

题目的意思就是一张图,各顶点与边都有权值,求出给定两点之间最短路的条数并输出此路径上的点权值和的最大值。


很简单的题目,一个dfs就可以很好的解决掉。

当然这个题目还可以继续增加点复杂度,就是把各条最短路的路径打印出来,这个也是很好实现的,加个pre数组,然后可以再来个dfs,当然也可以先来遍迪杰斯特拉。


# include <cstdio>
# include <cstdlib>
# include <climits>

const int Max = 501;
int Weight_vex[Max], visited[Max], map[Max][Max];//顶点权重,访问标志,路径权重
int path_max=INT_MAX, path_n=0, wei_max; //最长路径,最短路径数,最大顶点权重和

int N, M;

void init(int n);
void DFS(int start,int end,int path_long,int weit);
int main()
{
	int c1, c2;//出发城市,到达城市
	int x, y, Weight_arc;//x --> y 的路径权重,即距离
	int i;

	scanf("%d %d %d %d",&N, &M, &c1, &c2);
	init(N);
	for(i = 0; i < N; i ++)//顶点权重,即每个城市队员总数
	{
		scanf("%d",&Weight_vex[i]);
	}
	for(i = 0; i < M; i ++)
	{
		scanf("%d %d %d",&x, &y, &Weight_arc);

		if(map[x][y] > Weight_arc)
		{
			map[x][y] = Weight_arc;
			map[y][x] = Weight_arc;
		}
	}

	DFS(c1,c2,0,Weight_vex[c1]);

	printf("%d %d",path_n,wei_max);

	return 0;
}

void init(int n)//visited置零,map置无穷
{
	int i, j;
	for(i = 0; i < n; i ++)
	{
		visited[i] = 0;
		for(j = 0; j < n; j ++)
		{
			map[i][j] = INT_MAX;
		}
	}
}

void DFS(int start,int end,int path_long,int weit)
{
	if(start == end)
	{
		if(path_long < path_max)//first path
		{
			path_n = 1;
			path_max = path_long;
			wei_max = weit;
		}
		else if(path_long == path_max)//other paths
		{
			path_n ++;
			if(wei_max < weit)
			{
				wei_max = weit;
			}
		}

		return ;
	}

	if(path_long > path_max)//这个地方不剪枝的话,最后一个case超时
		return ;

	for(int i = 0; i < N; i ++)
	{
		if(visited[i] == 0 && map[start][i] != INT_MAX)
		{
			visited[i] = 1;
			DFS(i, end, path_long+map[start][i], weit+Weight_vex[i]);
			visited[i] = 0;
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值