Pagini recente » Cod sursa (job #540865) | Cod sursa (job #2879594) | Cod sursa (job #1335093) | Cod sursa (job #613406) | Cod sursa (job #766484)
Cod sursa(job #766484)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
#include <limits.h>
#include <set>
#include <algorithm>
using namespace std;
vector<bool> visited;
vector<vector<int> > adj;
vector<vector<int> > cost;
vector<int> path;
vector<pair<int,int> > Q;
int count;
class compair{
public:
bool operator()(pair<int,int> x,pair<int,int> y){
return (x>y);
}
};
void dijkstra(int n)
{
while (!Q.empty()){
int cst,k;
do{
pair<int,int> fe= Q.front();
cst = fe.first;
k = fe.second;
pop_heap(Q.begin(),Q.end(),compair());
Q.pop_back();
}while (visited[k] && !Q.empty());
if (!visited[k]){
visited[k]=true;
path[k] = cst;
for (int i=0;i<adj[k].size();i++)
{
if (!visited[adj[k][i]])
{
pair<int,int> t(cost[k][i]+cst,adj[k][i]);
Q.push_back(t);
push_heap(Q.begin(),Q.end(),compair());
}
}
}
}
}
int main()
{
FILE *f = fopen("dijkstra.in","r");
FILE *g = fopen("dijkstra.out","w+");
int n,m;
fscanf(f,"%d %d",&n,&m);
adj.resize(n+1);
visited.resize(n+1);
path.resize(n+1);
cost.resize(n+1);
for (int i=0;i<=n;i++){
visited[i]= false;
path[i] = 0;
}
for (int i=0;i<m;i++)
{
int a,b,c;
fscanf(f,"%d %d %d", &a,&b,&c);
adj[a].push_back(b);
cost[a].push_back(c);
}
pair<int,int> r;
r.first = 0;
r.second = 1;
Q.push_back(r);
//make_heap(Q.begin(),Q.end());
dijkstra(n);
for (int i=2;i<=n;i++)
fprintf(g,"%d ",path[i]);
fclose(f);
fclose(g);
}