IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Условия сортировки в STL, C++
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


А можно ли в priority_queue (ну и в ее подобных) в критерие сортировки указать (если равно чему-то то не соритровать)? Например, мне нужно сформировать heap, но чтобы первый элемент не был равен X.

P.S. И вот еще такой вопрос созрел: можно ли из вектора сделать что-то вроде двумерного массива (т.е. не 1 строка, а 2 например)? если да, то как, и как потом с этим работать?

Сообщение отредактировано: first_day -


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 86
Пол: Мужской
Реальное имя: Илья

Репутация: -  1  +


#include <fstream>
using namespace std;
int main ()
{
bool flag=true;
const int MAXN=100;
int sm[MAXN][MAXN], //матрица смежности
b[MAXN]={0}, //множества
d[MAXN], //расстояния
i,j,p,n,s,f;
ifstream in("input.txt");
ofstream out("output.txt");
in>>n>>s>>f;
s--; //из какой
f--; //в какую
for(i=0;i<n;d[i]=-1,b[i]=2,i++); //расстояния до всех -1, все принадлежат к 3 множеству
b[s]=0; //начальную вершину в 1 множество
d[s]=0; //расстояние до нее 0

/*1 множество - минимальное расстояние найдено
2-расстояние найдено, но не известно минимально ли оно,
3-пути нет*/

for(i=0;i<n;i++)
for(j=0;j<n;j++)
in>>sm[i][j];
for(i=0;i<n;i++) //нахожу соседей начальной вершины
if (sm[s][i]>0)
{
b[i]=1;
d[i]=sm[s][i];
}
while (flag)
{
flag=false;
int m=-1; //бесконечность
for(i=0;i<n;i++) //нахожу минимум из расстояний от началной вершины до вершин из 2 множества
if (b[i]==1 && (d[i]<m || m==-1))
{
m=d[i];
p=i;
}
b[p]=0; //переношу эту вершину в 1 множество
for(i=0;i<n;i++) //пробегаюсь по соседям этой вершины
if (sm[p][i]!=-1) //если путь есть
{
if (b[i]==2)
b[i]=1;
if (b[i]==1)
{
if (d[i]==-1)
d[i]=d[p]+sm[p][i];
else
d[i]=min(d[i],d[p]+sm[p][i]); //выбираю минимум из того, что было и что нашел
}
}
for(i=0;i<n;i++)
if (b[i]==1)//если есть вершины второго множества продолжаем
flag=true;
}
out<<d[f];
return 0;
}


Вход:
3 1 2
0 -1 2
3 0 -1
-1 4 0
выход: 6

-1 означает отсутствие пути.

С такими ограничениями все, конечно, работает. Но вдруг попадется задача с бОльшими да и просто интересно сделать...

Сообщение отредактировано: first_day -


--------------------
Я бы изменил мир, да Бог не дает исходников.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.06.2024 9:15
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name