Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- Шёл 2058 год. Колонии первых поселенцев уже высадились на Марсе и стали его обживать.
- Для нормального функционирования шатл-станция нуждается в постоянном питании от энергетической сети. Чтобы запитать станцию нужно либо построить урановый ядерный генератор энергии внутри самой станции, либо проложить кабель до другой (уже запитанной) шатл-станции. Стоимость строительства генератора внутри разных шатл-станций может отличаться. Проведение кабеля между шатл-станциями также варьируется по стоимости и не всегда возможно. Кабельное соединение является двунаправленным.
- Задача состоит в том, чтобы организовать эффективное (с минимальной стоимостью) питание всех шатл-станций.
- На вход программа получает общее число шатл-станций, стоимости строительства генераторов для каждой шатл-станции и описания всех возможных кабелей между шатл-станциями (номера соединяемых станций и стоимость прокладки кабеля).
- Формат ввода
- Первая строка содержит одно целое неотрицательное число шатл-станций N≤1000.
- Вторая строка содержит N чисел, задающих стоимости строительства генератора внутри соответствующей станции.
- Третья строка содержит одно целое неотрицательное число возможных кабелей K≤100000 между шатл-станциями.
- Последующие K строк (начиная с четвёртой) содержат описание одного кабеля - три целых неотрицательных числа: номер первой станции, номер второй станции и стоимость проведения.
- Формат вывода
- Одно целое число - минимальная стоимость питания всех шатл-станций для заднной конфигурации.
- Windows:
- gcc main.cpp -std=gnu++14 -lstdc++ -o main
- Linux:
- g++ -std=gnu++14 -Wall main.cpp -o main
- **/
- #include <iostream>
- #include <string>
- #include <vector>
- #include <sstream>
- using namespace std;
- class Cable{
- public:
- int start, end, w;
- Cable(int start, int end, int w) : start(start), end(end), w(w){}
- };
- class Base{
- public:
- int w;
- bool connect = false;
- Base(int w):w(w){}
- Base(int w, bool connect):w(w), connect(connect){}
- };
- class Mars{
- public:
- int cur_cab = 0;
- int max(vector<Base> base){
- int m = 0;
- for(unsigned int i=0; i<base.size(); i++){
- if (base[m].w < base[i].w) m = i;
- }
- return m;
- }
- int min(vector<Base> base){
- int m = -1;
- for(unsigned int i=0; i<base.size(); i++){
- if (base[i].connect==false){
- if (m==-1){
- m = i;
- continue;
- }
- if (base[m].w > base[i].w) {
- m = i;
- }
- }
- }
- return m;
- }
- int getNotConnected(vector<Base> &base, vector<Cable> &cab, int base_i){
- if (!base[base_i].connect) return -1;
- for (unsigned int i = 0; i<cab.size(); i++){
- cur_cab = i;
- if (cab[i].start == base_i && !base[cab[i].end].connect){
- if (base[cab[i].end].w > cab[i].w)
- return cab[i].end;
- }
- if (cab[i].end == base_i && !base[cab[i].start].connect){
- if (base[cab[i].start].w > cab[i].w)
- return cab[i].start;
- }
- }
- return -1;
- }
- int getConnected(vector<Base> &base, vector<Cable> &cab, int base_i){
- if (base[base_i].connect) return -1;
- for (unsigned int i = 0; i<cab.size(); i++){
- if (cab[i].start == base_i && base[cab[i].end].connect){
- if (base[cab[i].start].w > cab[i].w)
- return i;
- }
- if (cab[i].end == base_i && base[cab[i].start].connect){
- if (base[cab[i].end].w > cab[i].w)
- return i;
- }
- }
- return -1;
- }
- int calculate(vector<Base> &base, vector<Cable> &cab){
- int sum = 0, m = 0;
- while ((m = min(base))>-1){
- if (m==-1)
- return -1;
- int con = getConnected(base, cab, m);
- if (con>-1){
- base[m].connect = true;
- sum += cab[con].w;
- cout<<"Connect["<<m<<"] from cab["<<con<<"] cost="<<cab[con].w<<endl;
- continue;
- }
- base[m].connect = true;
- sum += base[m].w;
- cout<<"Init gen["<<m<<"] cost="<<base[m].w<<endl;
- int i = 0;
- while ((i = getNotConnected(base, cab, m))>-1){
- base[i].connect = true;
- sum += cab[cur_cab].w;
- cout<<"Connect base["<<i<<"] from cab["<<cur_cab<<"] cost="<<cab[cur_cab].w<<endl;
- }
- }
- return sum;
- }
- };
- void parseGen(const string& inpstr, vector<Base>& res){
- istringstream iss(inpstr);
- for(string str; iss >> str; ){
- int w = stoi(str);
- res.push_back(Base(w));
- cout<<"["<<w<<"]";
- }
- cout<<endl;
- }
- void parseCab(const string& inpstr, vector<Cable>& res){
- istringstream iss(inpstr);
- vector<int> buf;
- for(string str; iss >> str; )
- buf.push_back(stoi(str));
- if (buf.size()<3){
- cout<<"error cable ["<<inpstr<<"]"<<endl;
- } else{
- cout<<"cable ["<<buf[0]<<","<<buf[1]<<","<<buf[2]<<"]"<<endl;
- res.push_back(Cable(buf[0], buf[1], buf[2]));
- }
- }
- int main(int argc, char **argv)
- {
- int N;
- cin>>N;
- cin.ignore();
- string generatorCost;
- getline(cin, generatorCost);
- vector<Base> gen;
- parseGen(generatorCost, gen);
- int K;
- cin>>K;
- cin.ignore();
- string cables;
- vector<Cable> cab;
- for (int i = 0; i<K; i++){
- getline(cin, cables);
- parseCab(cables, cab);
- }
- Mars mars;
- cout<<"sum="<<mars.calculate(gen, cab)<<endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment