つなぎ島
質問する
https://programmers.co.kr/learn/courses/30/lessons/42861
コード#コード#
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
bool compare(vector<int> a,vector<int> b){ return a[2]>b[2]; }
bool bfs( vector<vector<int>> graph){
queue<pair<int,int>> q;
q.push({0,0});
while(!q.empty()){
int y=q.front().first;
int x=q.front().second;
q.pop();
for(int i=0;i<graph.size();i++){
if(graph[i][x]==1){
graph[i][x]=2;
q.push({i,x});
}
if(graph[y][i]==1){
graph[y][i]=2;
q.push({y,i});
}
}
}
for(int i=0;i<graph.size();i++){
if(graph[i][i]==1) return false;
}
return true;
}
int solution(int n, vector<vector<int>> costs) {
int answer = 0;
vector<vector<int>> graph(n,vector<int>(n,0));
for(int i=0;i<costs.size();i++){
graph[costs[i][0]][costs[i][1]]=1;
graph[costs[i][1]][costs[i][0]]=1;
answer+=costs[i][2];
}
for(int i=0;i<n;i++){
graph[i][i]=1;
}
sort(costs.begin(),costs.end(),compare);
for(auto i:costs){
graph[i[0]][i[1]]=0;
graph[i[1]][i[0]]=0;
if(bfs(graph)) answer-=i[2];
else{
graph[i[0]][i[1]]=1;
graph[i[1]][i[0]]=1;
}
}
return answer;
}
に答える
ネットの問題に似ているように見えます.島の数とこれらの島を接続するコストを教えてくれると、すべての島を接続する最低コストを知る必要があります.
私が確立した論理は、すべての島を接続した後、コストの高い順序で一つ一つ削除し、削除しても島を接続した場合、削除し、接続できなければ、元の状態に戻る方法で値を求めることです.
コードでは、まずすべての幹線をグラフィックに接続し、次にコストを追加します.
コスト降順に幹線を並べ、bfsを使用してすべての島が接続されているかどうかを判断します.
Reference
この問題について(つなぎ島), 我々は、より多くの情報をここで見つけました https://velog.io/@josajang98/섬-연결하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol