• A Walk Through the Forest dijkstra(邻接矩阵)


    http://acm.hdu.edu.cn/showproblem.php?pid=1142

    dijkstra(邻接矩阵)

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 using namespace std;
     5 const int INF=1<<29;
     6 const int MAXN=1000+5;
     7 int v[MAXN],d[MAXN];
     8 int w[MAXN][MAXN];
     9 int n,m;
    10 void dijkstra()
    11 {
    12     memset(v,0,sizeof(v));
    13     for(int i=1;i<=n;i++) d[i]=INF;
    14     d[2]=0;
    15     for(int i=1;i<=n;i++)
    16     {
    17         int x,m=INF;
    18         for(int y=1;y<=n;y++) if(!v[y]&&d[y]<=m) m=d[x=y];
    19         v[x]=1;
    20         for(int y=1;y<=n;y++) if(d[y]>d[x]+w[x][y]) d[y]=d[x]+w[x][y];
    21     }
    22 }
    23 int roat[MAXN];
    24 int dfs(int i)
    25 {
    26     int j,ans=0;
    27     if(roat[i]!=0) return roat[i];
    28     if(i==2) return 1;
    29     for(j=1;j<=n;j++) if(w[i][j]!=INF&&d[i]>d[j])
    30     {
    31         roat[j]=dfs(j);
    32         ans+=dfs(j);
    33     }
    34    return roat[i]=ans;
    35 }
    36 int main()
    37 {
    38     int i,j,a,b,wl;
    39     while(cin>>n&&n)
    40     {
    41         cin>>m;
    42         for(i=1;i<=n;i++)
    43         for(j=1;j<=n;j++)
    44             w[i][j]=INF;
    45         for(i=0;i<m;i++) {scanf("%d%d%d",&a,&b,&wl);w[a][b]=wl;w[b][a]=wl;}
    46         dijkstra();
    47         memset(roat,0,sizeof(roat));
    48         dfs(1);
    49         cout<<roat[1]<<endl;
    50     }
    51     return 0;
    52 }
  • 相关阅读:
    POJ 3252 Round Numbers
    HDU 1024 Max Sum Plus
    HDU 1024 Max Sum Plus Plus
    HDU 1698 Just a Hook
    HDU 1049 Climbing Worm
    HDU 3386 Reversi
    树状数组总结
    HDU 1556 Color the ball
    树形数组
    HDU 1188 敌兵布阵
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2585699.html
Copyright © 2020-2023  润新知