旅行商(TSP)
描述
Shrek是一个大山里的邮递员,每天负责给所在地区的n个村庄派发信件。但杯具的是,由于道路狭窄,年久失修,村庄间的道路都只能单向通过,甚至有些村庄无法从任意一个村庄到达。这样我们只能希望尽可能多的村庄可以收到投递的信件。
Shrek希望知道如何选定一个村庄A作为起点(我们将他空投到该村庄),依次经过尽可能多的村庄,路途中的每个村庄都经过仅一次,最终到达终点村庄B,完成整个送信过程。这个任务交给你来完成。
输入
第一行包括两个整数n,m,分别表示村庄的个数以及可以通行的道路的数目。
以下共m行,每行用两个整数v1和v2表示一条道路,两个整数分别为道路连接的村庄号,道路的方向为从v1至v2,n个村庄编号为[1, n]。
输出
输出一个数字,表示符合条件的最长道路经过的村庄数。
Example
Input
4 3
1 4
2 4
4 3
Output
3
限制
1 ≤ n ≤ 1,000,000
0 ≤ m ≤ 1,000,000
输入保证道路之间没有形成环
时间:2 sec
空间:256 MB
算法
#include <stdio.h>
#define MAX(a, b) ((a < b) ? b : a)
const int MAX_NUM = 1000000;
const int SZ = 1 << 25;
struct FastIO
{
char inbuf[SZ];
char outbuf[SZ];
FastIO()
{
setvbuf(stdin, inbuf, _IOFBF, SZ);
setvbuf(stdout, outbuf, _IOFBF, SZ);
}
} fastio;
int n, m, maxDepth = 0;
struct Vertex
{
int vertex;
Vertex *succ = nullptr;
};
int pVtxs[MAX_NUM];
int size_pVtxs = 0;
void push(const int &value) { pVtxs[++size_pVtxs] = value; }
int pop() { return pVtxs[size_pVtxs--]; }
struct GraphList
{
int inDegree = 0, depth = 0;
Vertex *first = nullptr;
};
GraphList GL[MAX_NUM];
void topoSort()
{
for (int i = 0; i < n; ++i)
{
if (!GL[i].inDegree)
push(i);
}
while (size_pVtxs)
{
int v = pop();
for (Vertex *p = GL[v].first; p; p = p->succ)
{
GL[p->vertex].depth = MAX((GL[v].depth + 1),
GL[p->vertex].depth);
maxDepth = MAX(GL[p->vertex].depth, maxDepth);
if (!(--GL[p->vertex].inDegree))
push(p->vertex);
}
}
}
int main(int argc, char const *argv[])
{
scanf("%d %d", &n, &m);
int v1, v2;
for (int i = 0; i < m; ++i)
{
scanf("%d %d", &v1, &v2);
--v1, --v2;
Vertex *pVtx = new Vertex;
pVtx->vertex = v2;
pVtx->succ = GL[v1].first;
GL[v1].first = pVtx;
++GL[v2].inDegree;
}
topoSort();
++maxDepth;
printf("%d\n", maxDepth);
return 0;
}
|