Pagini recente » Cod sursa (job #2741551) | Cod sursa (job #2355390) | Cod sursa (job #2550562) | Cod sursa (job #2128596) | Cod sursa (job #1155366)
#include <stdio.h>
#include <queue>
#include <vector>
#include <algorithm>
#define NMax 50002
#define INF 1<<30
using namespace std;
int n,m,i,nod1,nod2,cost,d[NMax];
std::vector<int> viz;
class Compare
{
public:
bool operator()(std::pair<int,int> t1, std::pair<int,int> t2)
{
if( t1.second > t2.second ) return true;
return false;
}
};
std::priority_queue< std::pair<int,int> , std::vector< std::pair<int,int> > , Compare > coada;
struct graf
{
int nod,cost;
graf *next;
};
graf *a[NMax];
void add(int where,int what,int cost)
{
graf *newid = new graf;
newid->nod = what;
newid->cost = cost;
newid->next = a[where];
a[where] = newid;
}
void dijkstra(int x0)
{
for(i=2;i<=n;++i)d[i]=INF;
coada.push(std::make_pair(x0,0));
int pmin = 0;
for(int j=1;j<=n;++j)
{
do
{
std::pair<int,int> foo;
foo = coada.top();
pmin = foo.first;
if(viz[pmin-1]==1)coada.pop();
}while(!(viz[pmin-1]==0||coada.size()==0));
if(coada.size()==0)break;
coada.pop();
viz[pmin-1] = 1;
graf *t = a[pmin];
while(t)
{
if(d[t->nod] > d[pmin] + t->cost)
{
d[t->nod] = d[pmin] + t->cost ;
coada.push(std::make_pair(t->nod,d[t->nod]));
}
t = t->next;
}
}
for(i=2;i<=n;++i)
{
if(d[i]==INF)printf("0 ");
else printf("%d ",d[i]);
}
}
int main()
{
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
scanf("%d %d",&n,&m);
viz.resize(n);
for(i=1;i<=m;++i)
{
scanf("%d %d %d",&nod1,&nod2,&cost);
add(nod1,nod2,cost);
}
dijkstra(1);
return 0;
}