话说,Cyh和香穗子是好朋友,一天他们在fzsz迷路了….Cyh在地点1,香穗子在地点n.由于Cyh是土生土长的fzsz人,所以Cyh准备去n地给香穗子带路.
fzsz是个奇怪的地方,它由n地点组成,并且任意两个地点A,B满足要么A能到B,要么B能到A,要么都不能互相到达,一定不存在A和B都能互相到达.
现在Cyh希望快点到达n地
输入:
第一行两个数n,m
接下来m行,每行两个数a,b,表示地点a能达到地点b
输出:
Cyh最少经过的地点数
Sample Input
4 5
1 2
2 3
2 4
1 3
3 4
Sample Output
3
数据范围:
n<=100000,m<=500000,保证有解
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <cstring>
#include <algorithm>
using namespace std;
int N, M;
struct Edge
{
int u, v, d; Edge *next;
Edge(){}
Edge(int v, int d, Edge *next):
v(v), d(d), next(next){}
}*edge[500005];
int dist[100005];
int queue[2000000];
bool Vst[100005];
inline void Ins(int u, int v, int d)
{
edge[u] = new Edge(v, d, edge[u]);
return;
}
void init_file()
{
freopen("3.in", "r", stdin);
freopen("3.out", "w", stdout);
}
void read_data()
{
scanf("%d%d", &N, &M);
for(int i = 0; i < M; i++)
{
int u, v;
scanf("%d%d", &u, &v);
Ins(u, v, 1);
}
return;
}
void work()
{
int S = 1;
static int f = 0, r = 0, u, v;
static Edge *p;
memset(dist, 0x4f, sizeof dist);
for(dist[queue[r++] = S] = 0, Vst[S] = 1; f < r;)
for(p = edge[u = queue[f++]], Vst[u] = 0; p; p = p -> next)
if(dist[v = p -> v] - p -> d > dist[u])
{
dist[v]= p -> d + dist[u];
if (!Vst[v]) Vst[queue[r++] = v] = 1;
}
printf("%d\n", dist[N] + 1);
return;
}
int main()
{
init_file();
read_data();
work();
return 0;
}
这道题也可以DP做…
但是用欧教的话来说…
DP的本质是有向无环图上求单源点最短路