Contact me:

算法43 1003 Emergency (25 分)有点问题!!

题目


求最短路径与最大点权

有点问题

代码里默认列表全部都是先只定义了,默认值就不稳定;
问题在这int nms[500];//最短路径数这里nms全部是为0的,如果把nms[500]改成nms[c],nms里面的值又有问题了;
然后单独定义一个列表里面的值都是乱的,很奇怪

code

dijkstra感觉有动规的味道,😕

#include <iostream>

using namespace std;
const int ifnt=99999;
bool rcd[500];
int main()
{
    int c, r,s0,s1;
    int tm[500];
    int team[500];
    int rd[500][500];
    fill(rd[0],rd[0]+500*500,ifnt);
//read
    cin>>c>>r>>s0>>s1;
    for(int i=0;i<c;i++){
        cin>>tm[i];
    }
    for(int i=0;i<r;i++){
        int p0,p1,lt;
        cin>>p0>>p1>>lt;
        rd[p0][p1]=rd[p1][p0]=lt;
    }
    
    team[s0]=tm[s0];
    auto road=rd[s0];//distance 2 s0
    road[s0]=0;
    int nms[500];//最短路径数
    nms[s0]=1;
    
    
    for(int i=0;i<c;i++){//times
        int place=-1;
        int minv=ifnt;
        
        for(int j=0;j<c;j++){//adjacent
            if(road[j]<minv&&rcd[j]!=1){
                place=j;
                minv=road[j];
            }
        }
        if(place==-1) break;
        rcd[place]=1;

        for(int k=0;k<c;k++){//优化路径

            if(rcd[k]==0&&road[k]>road[place]+rd[place][k]){
                road[k]=road[place]+rd[place][k];
                nms[k]=nms[place];
                
                team[k]=team[place]+tm[k];
                
            }else if(rcd[k]==0&&road[k]==road[place]+rd[place][k]){
                nms[k]=nms[k]+nms[place];    
                if(team[k]<team[place]+tm[k])
                    team[k]=team[place]+tm[k];
            }
        }        
    }
    cout<<nms[s1]<<" "<<team[s1]<<endl;

  return 0;
}
posted @ 2022-03-01 16:50  impwa  阅读(14)  评论(1编辑  收藏  举报