Pagini recente » Cod sursa (job #1453064) | Cod sursa (job #1636475) | Cod sursa (job #7871) | Cod sursa (job #1954946) | Cod sursa (job #1696312)
/*#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#define NMAX 50005
#define INF INT_MAX
using namespace std;
ifstream cin("dijkstra.in");
ofstream cout("dijkstra.out");
vector< pair<int,int> > G[NMAX];
int n,p,D[NMAX],t[NMAX],viz[NMAX],m;
void citire(){
cin>>n>>m;
p=1;
int i,j,x,parcurg;
for(parcurg=1;parcurg<=m;parcurg++){
cin>>i>>j>>x;
G[i].push_back(make_pair(j,x));
}
}
queue<int> coada;
void dijkstra(){
viz[p]=1;
vector< pair <int,int> >::iterator it;
int i,k;
for(it=G[p].begin();it!=G[p].end();++it){
D[it->first]=it->second;
coada.push(it->first);
t[it->first]=p;
}
for(i=1;i<=n;i++)
if(D[i]==0){
D[i]=INF;
t[i]=0;
}
bool ok=1;
while(ok){
int MIN=INF;
for(i=1;i<=n;i++)
if(!viz[i]&&MIN>D[i]){
MIN=D[i];
k=i;
}
if(MIN!=INF){
viz[k]=1;
for(it=G[k].begin();it!=G[k].end();++it)
if(!viz[it->first]&&D[it->first]>D[k]+it->second){
D[it->first]=D[k]+it->second;
t[it->first]=k;
}
}
else ok=0;
}
for(i=1;i<=n;i++)
if(i==p)
;
else if(D[i]==INF)
cout<<0<<' ';
else
cout<<D[i]<<' ';
}
void afisare(){
vector< pair<int,int> >::iterator it;
int i;
for(i=1;i<=n;i++){
for(it=G[i].begin();it!=G[i].end();++it)
cout<<i<<' '<<it->first<<' '<<it->second<<'\n';
}
}
int main(){
citire();
dijkstra();
//afisare();
return 0;
}
*/
#include <cstdio>
const int maxn = 50001;
const int inf = 1 << 30;
FILE *in = fopen("dijkstra.in","r"), *out = fopen("dijkstra.out","w");
struct graf
{
int nod, cost;
graf *next;
};
int n, m;
graf *a[maxn];
int d[maxn], q[maxn];
void add(int where, int what, int cost)
{
graf *q = new graf;
q->nod = what;
q->cost = cost;
q->next = a[where];
a[where] = q;
}
void read()
{
fscanf(in, "%d %d", &n, &m);
int x, y, z;
for ( int i = 1; i <= m; ++i )
{
fscanf(in, "%d %d %d", &x, &y, &z);
add(x, y, z);
}
}
void dijkstra()
{
for ( int i = 2; i <= n; ++i )
d[i] = inf;
int min, pmin = 0;
for ( int i = 1; i <= n; ++i )
{
min = inf;
for ( int j = 1; j <= n; ++j )
if ( d[j] < min && !q[j] )
min = d[j], pmin = j;
q[pmin] = 1;
graf *t = a[pmin];
while ( t )
{
if ( d[ t->nod ] > d[pmin] + t->cost )
d[ t->nod ] = d[pmin] + t->cost;
t = t->next;
}
}
}
int main()
{
read();
dijkstra();
for ( int i = 2; i <= n; ++i )
fprintf(out, "%d ", d[i] == inf ? 0 : d[i]);
fprintf(out, "\n");
return 0;
}