zoukankan      html  css  js  c++  java
  • hdu 1142 A Walk Through the Forest (最短路+dfs)

    先求一遍最短路,再根据求出来的每一个点到达终点的最短距离,dfs计数

    View Code
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N =1001;
    int g[N][N],n,m,dist[N];
    int ans,dp[N];
    bool vis[N];
    void init()
    {
    for(int i=0;i<=n;i++)
    for(int j=0;j<=n;j++)
    g[i][j]=INT_MAX;
    }
    void Dijkstra(int s)
    {
    memset(vis,false,sizeof(vis));
    vis[s]=true;
    for(int i=1;i<=n;i++)
    dist[i]=g[s][i];
    dist[s]=0;
    for(int i=1;i<n;i++)
    {
    int mind=INT_MAX,v=0;
    for(int j=1;j<=n;j++)
    {
    if(!vis[j] && dist[j]<mind)
    {
    mind=dist[j];
    v=j;
    }
    }
    vis[v]=true;
    for(int k=1;k<=n;k++)
    {
    if(g[v][k]!=INT_MAX && !vis[k])
    {
    int newdis=dist[v]+g[v][k];
    if(newdis<dist[k])
    dist[k]=newdis;
    }
    }
    }
    }
    int dfs(int u)
    {
    if(u==2)
    {
    return dp[u]=1;
    }
    if(dp[u]!=-1)
    return dp[u];
    int sum=0;
    for(int i=1;i<=n;i++)
    {
    if(g[u][i]!=INT_MAX && dist[u]>dist[i])
    sum+=dfs(i);
    }
    return dp[u]=sum;
    }
    int main()
    {
    int a,b,c;
    while(scanf("%d",&n)==1&&n)
    {
    init();
    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
    scanf("%d %d %d",&a,&b,&c);
    g[a][b]=g[b][a]=c;
    }
    Dijkstra(2);
    memset(dp,-1,sizeof(dp));
    printf("%d\n",dfs(1));
    }
    return 0;
    }
  • 相关阅读:
    python修改镜像源
    nginx 记录
    linux 常用命令
    修改ssh连上默认目录
    sqlplus 导出一张表数据
    推送kafka消息失败
    Mybatis generator配置
    Oracle导库
    docker -- 安装mysql8.0.16
    安装自动集成工具jenkins
  • 原文地址:https://www.cnblogs.com/nanke/p/2410060.html
Copyright © 2011-2022 走看看