• hdu 1142(DFS+dijkstra)


    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<map>
    #include<cstdlib>
    #include<vector>
    #include<set>
    #include<queue>
    #include<cstring>
    #include<string.h>
    #include<algorithm>
    typedef long long ll;
    typedef unsigned long long LL;
    using namespace std;
    const int maxNodeNum=1010;//最多节点个数
    const int maxEdgeNum=1001000;//最多边条数
    const int INF=0x3f3f3f3f;
    int n,m;//节点,有向边个数
    int mp[maxNodeNum][maxNodeNum];//建立邻接矩阵
    int dis[maxNodeNum];//dis[i]为源点到i的最短路径
    bool vis[maxNodeNum];//判断某个节点是否已加入集合
    int p[maxNodeNum];
    void dijkstra(int start)
    {
        memset(dis,INF,sizeof(dis));
        memset(vis,0,sizeof(vis));
        dis[start]=0;//一开始集合里没有任何点,下面的循环中,第一个找到的点肯定是源点
        for(int i=1;i<=n;i++){
            int MinNumber,Min=INF;//MinNumber为dis[]值最小的点的编号
            for(int j=1;j<=n;j++)
            {
                if(dis[j]<Min&&!vis[j])
                {
                    Min=dis[j];
                    MinNumber=j;
                }
            }//找到dis[]最小的点,加入集合,更新与其相连的点的dis值
            vis[MinNumber]=1;
            for(int j=1;j<=n;j++)
                if(dis[MinNumber]+mp[MinNumber][j]<dis[j])
                dis[j]=dis[MinNumber]+mp[MinNumber][j];
        }
    }
    int DFS(int s)
    {
        if(p[s]) return p[s];
        if(s==2)  return 1;
        int i,sum=0;
        for(i=1;i<=n;i++)
        {
           if(mp[s][i]<INF&&dis[s]>dis[i])
           {
               if(p[i]) sum=sum+p[i];
               else sum=sum+DFS(i);
            }
        }
        sum=sum+p[s];
        p[s]=sum;
        return p[s];
    }
    int main()//109MS
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            if(n==0)break;
            int a,b,c;
            memset(mp,INF,sizeof(mp));
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d",&a,&b,&c);
                if(c<mp[a][b])
                    mp[a][b]=mp[b][a]=c;
            }
            dijkstra(2);
            memset(p,0,sizeof(p));
            cout<<DFS(1)<<endl;
      }
      return 0;
    }
    
  • 相关阅读:
    HDU 6125
    HDU 6129
    Super Jumping! Jumping! Jumping!
    HDU 1040 As Easy As A+B(排序)
    VS2015转VS2008
    HDU 1329 Hanoi Tower Troubles Again!(乱搞)
    HDU 1062 Text Reverse(字符串)
    HDU 1013 Digital Roots(字符串)
    HDU 1003 Max Sum(动态规划)
    HDU 1203 I NEED A OFFER!(01背包)
  • 原文地址:https://www.cnblogs.com/Aa1039510121/p/6103401.html
Copyright © 2020-2023  润新知