Pagini recente » Cod sursa (job #1733734) | Cod sursa (job #1788077) | Cod sursa (job #2346594) | Cod sursa (job #2027073) | Cod sursa (job #186707)
Cod sursa(job #186707)
#include <cstdio>
#include <vector>
#include <set>
using namespace std;
const int N = 8;//50000;
const int INF = 0x3f3f3f3f;
int n,m;
vector< pair<int,int> > g[N];
int d[N];
class dist_cmp {
public:
bool operator() ( int a, int b ) { return d[a] < d[b]; };
};
template <class Cmp>
void print ( multiset<int, Cmp> &s ) {
for (multiset<int, Cmp>::iterator it = s.begin(); it != s.end(); ++it) {
fprintf(stderr," %d",*it+1);
}
fprintf(stderr,"\n");
}
void dijkstra() {
multiset<int, dist_cmp> s;
d[0] = 0;
for (int i = 1; i < n; ++i) d[i] = INF;
for (s.insert(0); !s.empty(); s.erase(s.begin())) {
int c = *s.begin();
vector< pair<int,int> > &cg = g[c];
for (int i = 0; i < cg.size(); ++i) {
int nd = d[c] + cg[i].second;
if (d[cg[i].first] > nd) {
multiset<int, dist_cmp>::iterator wh = s.find(cg[i].first);
if (wh != s.end()) s.erase(wh);
d[cg[i].first] = nd;
s.insert(cg[i].first);
fprintf(stderr,"Am actualizat distanta pana la %d la %d\n",cg[i].first+1,d[cg[i].first]);
print(s);
}
}
}
}
int main() {
freopen("dijkstra.in","rt",stdin);
freopen("dijkstra.out","wt",stdout);
scanf("%d %d",&n,&m);
for (int i = 0; i < m; ++i) {
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
--a; --b;
g[a].push_back(make_pair(b,c));
}
dijkstra();
for (int i = 1; i < n; ++i) printf("%d ",(d[i] == INF) ? 0 : d[i]);
printf("\n");
return 0;
}