Pagini recente » Istoria paginii utilizator/apemasonul431 | Monitorul de evaluare | Istoria paginii utilizator/dabruhlmaoborghini | Monitorul de evaluare | Cod sursa (job #1707054)
#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));
A[b].push_back(make_pair(a,c));
pair<pereche,int> pdp;
pdp=make_pair(make_pair(a,b),c);
minHeap.push(pdp);
}
}
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;
pdp=minHeap.top();
viz[1]=1;
while(!minHeap.empty())
{
int ok=0;
pdp=minHeap.top();
if(pdp.first.first==1)
{vdi[pdp.first.second]=pdp.second;
minHeap.pop();
viz[pdp.first.second]=1;
pdp=minHeap.top();
ok=1;
}
if(pdp.first.second==1)
{
vdi[pdp.first.first]=pdp.second;
minHeap.pop();
viz[pdp.first.second]=1;
pdp=minHeap.top();
ok=1;
}
if(viz[pdp.first.second]==1 && viz[pdp.first.first]!=1)
{
vdi[pdp.first.first]=vdi[pdp.first.second]+pdp.second;
viz[pdp.first.first]=1;
minHeap.pop();
pdp=minHeap.top();
ok=1;
}
if(viz[pdp.first.first]==1 && viz[pdp.first.second]!=1)
{
vdi[pdp.first.second]=vdi[pdp.first.first]+pdp.second;
viz[pdp.first.second]=1;
minHeap.pop();
pdp=minHeap.top();
ok=1;
}
if(viz[pdp.first.first]==0 && viz[pdp.first.second]==0)
{
vdi[pdp.first.first]+=pdp.second;
vdi[pdp.first.second]+=pdp.second;
minHeap.pop();
pdp=minHeap.top();
ok=1;
}
if(ok==0)
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();
}