• hdu1142 A Walk Through the Forest( Dijkstra算法+搜索)


    看到这道题,想起了我家旁边的山!


    那是一座叫做洪山寨的山,据说由当年洪秀全的小妾居住于此而得名!


    山上盛产野果(很美味)!

    好久没有爬上去了!

    #include<stdio.h>
    #include<string.h>
    #define MAX 100000000


    int map[1010][1010];
    int res[1010];
    int dist[1010];
    bool visited[1010];
    int n,m;


    void Dijkstra(int v)  
    {
    int i,tmp_index,tmp,j,k;
    for(i=1;i<=n;i++)
    {
    visited[i]=false;
    dist[i]=map[2][i];
    }
    visited[2]=true;
    dist[2]=0;
    for(i=2;i<=n;i++)
    {
    tmp=MAX;
    tmp_index=0;
    for(j=1;j<=n;j++)
    {
    if(!visited[j]&&dist[j]<tmp)
    {
    tmp=dist[j];
    tmp_index=j;
    }
    }
    visited[tmp_index]=true;
    for(k=1;k<=n;k++)
    {
    if(!visited[k]&&dist[k]>dist[tmp_index]+map[k][tmp_index])
    dist[k]=dist[tmp_index]+map[k][tmp_index];
    }
    }
    }


    int solve(int v)
    {
    int i;
    if(res[v]!=-1)
    return res[v];
    if(v==2)
    return 1;
    res[v]=0;
    for(i=1;i<=n;i++)
    if(map[i][v]!=MAX&&dist[i]<dist[v])
    res[v]+=solve(i);
    return res[v];
    }


    int main()
    {
    int i,a,b,c,j;
    while(scanf("%d",&n),n)
    {
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
    if(i==j)
    map[i][j]=0;
    else
    map[i][j]=MAX;
    }
    scanf("%d",&m);
    while(m--)
    {
    scanf("%d%d%d",&a,&b,&c);
    map[a][b]=c;
    map[b][a]=c;
    }
    Dijkstra(2);
    memset(res,-1,sizeof(res));
    printf("%d ",solve(1));
    }
    return 0;
    }

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1142

  • 相关阅读:
    docker入门(一)
    netstat命令
    grep的小技巧
    gd库的安装
    jar命令的用法详解
    关于awk的范围模式功能问题
    更换文本中第二次出现的字符串内容
    awk打印第n个参数到最后一个技巧/将n行组成一列
    awk -f program.file 功能使用
    shell的变量处理
  • 原文地址:https://www.cnblogs.com/aukle/p/3233690.html
Copyright © 2020-2023  润新知