Mai intai trebuie sa te autentifici.
Cod sursa(job #1707511)
Utilizator | Data | 25 mai 2016 12:37:53 | |
---|---|---|---|
Problema | Algoritmul lui Dijkstra | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 3.38 kb |
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
typedef pair<int , int > pereche;
int vdi[50001];
int viz[50001];
struct comparator {
bool operator()(pair<pereche,int> i,pair<pereche,int> j) {
return i.second > j.second;
}
};
priority_queue< pair<pereche,int>, std::vector<pair<pereche,int> >, comparator> minHeap;
class graf
{ int n , m,c;
vector <pair<int,int> > A[50000];
public:
void citire(char *numfis)
{ int i;
ifstream f(numfis);
f>>n;
f>>m;
for(i=0;i<m;i++)
{ int a ,b,c;
f>>a>>b>>c;
A[a].push_back(make_pair(b,c));
}
}
void afisare()
{ int i , j;
for(i=1;i<=n;i++)
{ cout<<"\n"<<i<<": ";
for(j=0;j<A[i].size();j++)
cout<<A[i][j].first<<" ";
}
}
void Dijkstra()
{
int i;
pair <pereche,int> pdp,pdp2;
viz[1]=1;
for(i=0;i<A[1].size();i++)
{
pdp=make_pair(make_pair(1,this->A[1][i].first),this->A[1][i].second);
minHeap.push(pdp);
}
pdp=minHeap.top();
while(!minHeap.empty())
{
int ok=0;
pdp=minHeap.top();
if(viz[pdp.first.first] && viz[pdp.first.second]==0)
{
vdi[pdp.first.second]=vdi[pdp.first.first]+pdp.second;
viz[pdp.first.second]=pdp.first.first;
minHeap.pop();
for(i=0;i<A[pdp.first.second].size();i++)
{
if(viz[A[pdp.first.second][i].first]==0)
{
pdp2=make_pair(make_pair(pdp.first.second,this->A[pdp.first.second][i].first),this->A[pdp.first.second][i].second);
minHeap.push(pdp2);
}
}
}
else
if(viz[pdp.first.second]&& viz[pdp.first.first]==0)
{
vdi[pdp.first.first]=vdi[pdp.first.second]+pdp.second;
viz[pdp.first.first]=pdp.first.second;
minHeap.pop();
for(i=0;i<A[pdp.first.first].size();i++)
{
if(viz[A[pdp.first.first][i].first]==0)
{pdp=make_pair(make_pair(pdp.first.first,this->A[pdp.first.first][i].first),this->A[pdp.first.first][i].second);
minHeap.push(pdp);}
}
}
else
{
if(vdi[pdp.first.first]+pdp.second <vdi[pdp.first.second])
vdi[pdp.first.second]=vdi[pdp.first.first]+pdp.second;
else
if(vdi[pdp.first.second]+pdp.second<vdi[pdp.first.first])
vdi[pdp.first.first]=vdi[pdp.first.second]+pdp.second;
minHeap.pop();
}
}
ofstream g("dijkstra.out");
for(i=2;i<=this->n;i++)
g<<vdi[i]<<" ";
}
};
int main()
{ graf G;
ifstream f("dijkstra.in");
G.citire("dijkstra.in");
G.Dijkstra();
}