题目和代码如下:
#include "stdafx.h"
#include<iostream>
#include<algorithm>
using namespace std;
//题目如下
//三年二班的同学们要去郊游了,他们决定所有人都从一个地方出发,但是每个人都要有不同的路线,最终完成一次郊游。所以他们想知道,在它们去的公园里,究竟有多少种不同的路线供选择。
//公园可以被描述为一个具有N个结点,M条有向边的图,你要做的任务就是,选择其中某个点,使得其能够产生尽量多的从这个点出发的路线。(怎么感觉肯定是初始节点呢)
//提示:此处可以利用node代表结点的总数,结点编号从0到node - 1。edge用来描述边。你的程序应该返回路径最多的结点对应的路径数。
//注意:所有的边都是有向边!数据输入将保证不包含环路,不包括重复的边。
//输入数据示例:
//node = 4
//edge = { { 0, 1 },{ 1, 2 },{ 2, 3 },{ 0, 2 } },包含4条有向边
//输出结果:5
//示例解释:
//显然,0号节点应该是起点。
//对应的5条路线为:
//0 1
//0 1 2
//0 1 2 3
//0 2
//0 2 3
int findPath(int** matrix, int node, int i, int numberOfPath) {
for (int j = 0; j <node; j++)
{
if (matrix[i][j])
{
numberOfPath = 1 + findPath(matrix,node,j,numberOfPath);//从i的相邻的几点开始遍历
}
}
return numberOfPath;
}
//整个题目就是图的深度优先遍历
int main()
{
//读取数据
int node;
cin >> node;
//邻接表的声明和初始化
int** matrix = new int*[node];
for (int i = 0; i < node; i++)
{
matrix[i] = new int[node];
}
for (int i = 0; i < node; i++)
{
for (int j = 0; j < node;j++) {
matrix[i][j] = 0;
}
}
//读取数组
//这里要确定边数
int edge;
cin >> edge;
int x, y;
for (int j = 0; j < edge;j++) {
cin >> x;
cin >> y;
matrix[x][y] = 1;
}
//对每个节点做图的深度优先遍历,统计以此节点为开始节点的路径个数
int numOfPath = 0;
for (int i = 0; i < node; i++)
{
numOfPath = max(numOfPath,findPath(matrix,node,i,0));//对每个顶点最开始调用findPath函数时,出师路径个数为0
}
printf("%d ",numOfPath);
system("pause");
return 0;
}
`