1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
А можно ли в priority_queue (ну и в ее подобных) в критерие сортировки указать (если равно чему-то то не соритровать)? Например, мне нужно сформировать heap, но чтобы первый элемент не был равен X.
P.S. И вот еще такой вопрос созрел: можно ли из вектора сделать что-то вроде двумерного массива (т.е. не 1 строка, а 2 например)? если да, то как, и как потом с этим работать?
#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 означает отсутствие пути.
С такими ограничениями все, конечно, работает. Но вдруг попадется задача с бОльшими да и просто интересно сделать...