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;
    }
  • 相关阅读:
    KMP算法
    快速排序的三种分区方法
    广义表
    外部排序(败者树、置换-选择排序、最佳归并树)
    内部排序
    散列表
    B树和B+树
    查找(顺序、折半、分块)
    关键路径
    拓扑排序
  • 原文地址:https://www.cnblogs.com/nanke/p/2410060.html
Copyright © 2011-2022 走看看