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;
}
}
}