【动态规划】【最短路径】Problem 3 Cyh和香穗子

来源:互联网 发布:淘宝店铺项目规划方案 编辑:程序博客网 时间:2024/06/03 02:55

  话说,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的本质是有向无环图上求单源点最短路


原创粉丝点击