使用DFS查找图中的最低成本

时间:2019-06-19 05:26:27

标签: c++ graph

我正在努力解决关于hackerrank的问题,该问题涉及计算在受龙卷风影响的许多互联城市中建立图书馆的最低成本。我正在使用DFS搜索该图并查找已连接组件的数量(在这种情况下为城市),并获得最终费用。还有一种情况是,在每个城市建造图书馆的成本要比在其他城市建造将人们连接到图书馆的道路要少。在那种情况下,我只输出了每个图书馆的建设成本乘以城市数量。 问题的链接:https://www.hackerrank.com/challenges/torque-and-development/problem?h_l=interview&playlist_slugs%5B%5D=interview-preparation-kit&playlist_slugs%5B%5D=graphs

由于某种原因,当我的代码进入else部分时,当我尝试为每个城市构建邻接列表时,输出终端会过早退出。我的逻辑是否正确,还是存在某种范围问题? 定义变量和函数dfs()的类:

class minCost{
    public:
        vector<vector<int>>adjCities;
        int connComps;
        vector<bool>visited;

        void dfs(int city){
            visited[city]=true;
            for(int i=0;i<adjCities[city].size();i++){
                while(!visited[adjCities[city][i]]){
                    dfs(adjCities[city][i]);
                }
            }
        }
};

main()方法中的其余逻辑:

int main(){
    int q;
    cin>>q;
    for(int i=0;i<q;i++){
        minCost cst;
        int c,r,c_lib,c_road;
        cin>>c>>r>>c_lib>>c_road;
        if(c_lib<=c_road || r==0){
            cout<<c_lib*c<<"\n";
        continue;
        }
        else{
            for(int i=0;i<r;i++){   //does not loop for r=(no. of roads) times
                int c1,c2;
                cin>>c1>>c2;
                cst.adjCities[c1].push_back(c2);
                cst.adjCities[c2].push_back(c1);
            }
            for(int i=1;i<=c;i++){
                if(!cst.visited[i]){
                    cst.dfs(i);
                    cst.connComps++;
                }
            }
            cout<<c_road*(c-cst.connComps)+c_lib*cst.connComps<<"\n";
        }
    }
    return 0;
}

1 个答案:

答案 0 :(得分:3)

您没有声明adjCities的大小并已访问。但是您在尝试使用它时会发现未分配的数组索引。 只需初始化这两个向量的大小即可。 在此 cin >> c >> r >> c_lib >> c_road; 行之后,添加这两行-

cst.adjCities.resize(c+1);
cst.visited.resize(c+1);
cst.connComps = 0;

希望这会有所帮助。