zoukankan      html  css  js  c++  java
  • l2-001

    最短路板子题,打印路径

    代码:

    #include<bits/stdc++.h>
    const int maxn=1e3+10;
    const int inf=0x3f3f3f3f;
    
    using namespace std;
    
    int n,m,s,d;
    struct node
    {
        int vis;
        int dis;
        int path=-1;
        int num;//救援队数目
        int getnum;//最短长度
        int cnt;  
    }a[maxn];
    //vector<int> G[maxn];
    //int dist[maxn][maxn];
    int G[maxn][maxn];
    
    void init(int start)
    {
        for(int i=0; i<n; i++)
        {
            a[i].vis=0;
            a[i].dis=inf;
            a[i].cnt=0;
        }
        a[start].dis=0;
    }
    void printpath(int v)
    {
        if(a[v].path!=v)
        {
          printpath(a[v].path);
          printf(" %d",v);
           return ;
        }
        printf("%d",v);
    }
    
    void dijkstra(int s)
    {
        int cur=s;
        a[cur].cnt=1;
        a[cur].vis=1;
        a[cur].getnum=a[cur].num;
        a[cur].dis=0;
        a[cur].path=cur;
        for(int v=0; v<n; v++)
        {
            int ans=inf;
            for(int w=0; w<n; w++)
            {
                if(cur==w) continue;
                
                    if(!a[w].vis&&a[cur].dis+G[cur][w]<a[w].dis&&a[cur].dis!=inf)
                    {
                         a[w].dis=a[cur].dis+G[cur][w];
                         a[w].path=cur;
                         a[w].getnum=a[cur].getnum+a[w].num;
                         a[w].cnt=a[cur].cnt;
                    }
                else if(a[cur].dis+G[cur][w]==a[w].dis)
                {
                    a[w].cnt+=a[cur].cnt;
                    if(a[w].getnum<a[cur].getnum+a[w].num)
                    {
                        a[w].getnum=a[cur].getnum+a[w].num;
                        a[w].path=cur;
                    }
                }
            }
    
            for(int w=0; w<n; w++)
            {
                if(cur==w) continue;
                if(!a[w].vis&&a[w].dis<ans)
                {
                    ans=a[w].dis;
                    cur=w;
                }
            }
            a[cur].vis=1;
    
        }
    }
    int main()
    {
        scanf("%d%d%d%d",&n,&m,&s,&d);
        for(int i=0; i<n; i++) scanf("%d",&a[i].num);
        for(int i=0; i<n; i++)
         for(int j=0; j<n; j++)
          G[i][j]=inf;
        for(int i=0; i<m; i++)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            G[u][v]=G[v][u]=w;
        }
        init(s);
        dijkstra(s);
        printf("%d %d
    ",a[d].cnt,a[d].getnum);
        printpath(d);
        system("pause");
        return 0;
    }
  • 相关阅读:
    java 28
    java 28
    java 27
    java 27
    java 27
    java 27
    java 27
    java 27
    java 27
    java 27
  • 原文地址:https://www.cnblogs.com/sweetlittlebaby/p/13709586.html
Copyright © 2011-2022 走看看