pat 1003 Emergency (值得重点回顾)

一开始看错题意,题意是要求单源点对最短路径数和最大的点权重之和。知道要用dijskra算法,但为了求最短路径数,还得用深搜,依次把点加入集合中,若路径长度=最短路径值时,路径数+1。同时求出最大的点权重之和。

递归函数{
出口条件处理(最低级的情况);
return ...;
从第1列的8个位置{
依次尝试设置格子及限制区域
向下级递归
复原上一次尝试
}
};


AC代码:

#include
using namespace std;
const int INF=1000000;
const int NUM=505;
int map[NUM][NUM];
int team[NUM],isVisit[NUM];
int dist[NUM];
int ans,maxTeamNum;

void init()
{
	int i,j;
	for(i=0;idist[index]+map[index][j])
				dist[j]=dist[index]+map[index][j];
		}
	}
	
	
}

void dfs(int n,int cId,int dest,int curDis,int curTeamNum)
{
	int i;
	isVisit[cId]=1;
	if(cId==dest){
		if(curDis==dist[dest]){
			ans++;//最短路径数+1
			if(curTeamNum>maxTeamNum)
				maxTeamNum=curTeamNum;
		}
		return;
	} 
	if(curDis>dist[dest])//当前的路径长度已经超过最短路径,就没有必要继续搜索了。
		return;
	for(i=0;i>n>>m>>source>>dest;
	init();
	for(i=0;i>team[i];
	for(i=0;i>c1>>c2>>l;
		map[c1][c2]=l;
		map[c2][c1]=l;
	}
	dijskra(n,source);
	for(i=0;i

DFS递归的基本套路:



你可能感兴趣的:(图论,PAT,重点回顾,DFS)