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;
}
原文地址:https://www.cnblogs.com/sweetlittlebaby/p/13709586.html