Pagini recente » Cod sursa (job #1854413) | Cod sursa (job #1941377) | Cod sursa (job #1031495) | Cod sursa (job #2395504) | Cod sursa (job #893062)
Cod sursa(job #893062)
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#define nlength 200001
using namespace std;
int n,m;
vector< pair <int,int> > mylist[nlength];
bool vizitat[nlength];
int cost[nlength];
int retine[nlength];
typedef pair<int, int> P;
priority_queue< P, vector<P>, greater<P> > myheap; //heap extract min
//priority_queue <P ,vector<P> > myheap; //heap extract max
bool extrage_min(int &x,int &y)
{
if(myheap.empty())
{
return 0;
}
pair <int,int> a=myheap.top();
myheap.pop();
if(a.second<=n)
{
if(vizitat[a.second])
{
extrage_min(x,y);
}
else
{
x=a.first;
y=a.second;
vizitat[a.second]=1;
return 0;
}
}
else
{
return 1;
}
}
int resolve(int s)
{
vector< pair< int,int > >::iterator it;
pair <int,int> a;
for(it=mylist[s].begin();it!=mylist[s].end();it++)
{
a=*it;
if(!vizitat[a.second])
{
a.first+=cost[s];
myheap.push(a);
}
}
bool oki=extrage_min(a.first,a.second);
retine[a.second]=a.first;
if(myheap.empty() || oki==1)
{
return 0;
}
cost[a.second]=a.first; //cost->first
return resolve(a.second); // nod->second
}
int main()
{
FILE *inFile;
FILE *outFile;
inFile =fopen("dijkstra.in","r");
outFile=fopen("dijkstra.out","w");
fscanf(inFile,"%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b,c;
fscanf(inFile,"%d %d %d",&a,&b,&c);
mylist[a].push_back( make_pair(c,b) ); // retinem pe p.first costul si pe p.second nodul spre care se duce
mylist[b].push_back( make_pair(c,a) ); // pt ca e nevoie cand se fac comparatiile in priority_queue de cost sa fie primul
}
cost[1]=0;
vizitat[1]=1;
resolve(1);
/*for(int i=1;i<=n;i++)
{
printf("%d %d\n",i,retine[i]);
}*/
for(int i=2;i<=n;i++)
{
fprintf(outFile,"%d ",cost[i]);
} fprintf(outFile,"\n");
fclose(inFile);
fclose(outFile);
return 0;
}