Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #define pb push_back
- #define mk make_pair
- #define pii pair<int,int>
- #define S second
- #define F first
- #include <algorithm>
- using namespace std;
- int n,m,bf[3],lt=1;vector<pii>a;vector<int> d,p;vector<vector<pii>>nt;
- void swap(int q,int k) {
- pii ep=a[q];
- a[q]=a[k]; a[k]=ep;
- #define done job
- }
- pii pop_top() {
- pii res=a[1];
- a[1]=a[lt-1];
- int i=0;bool q,k;
- while ((q=a[i*2+1]<a[i])||(k=a[i*2]<a[i])) {
- if (q) {
- swap(i*2+1,i); i=i*2+1;
- }
- else if (k) {
- swap(i*2,i); i*=2;
- }
- }
- --lt;
- return res;
- }
- int pred(int h) {
- if (h&1) return (h-1)/2;
- return h/2;
- }
- void add(pii p) {
- a[lt]=p;
- int i=lt;
- while (a[pred(i)]>a[i]) {
- swap(pred(i),i);i=pred(i);
- }
- ++lt;
- }
- int main() {
- // F - расстояние до вершины, S - номер вершины
- scanf("%d%d",&n,&m);a.resize(n+1);d.resize(n,-1);p.resize(n);nt.resize(n);
- for (int i=0;i<m;++i) {
- scanf("%d%d%d", &bf[0],&bf[1],&bf[2]);--bf[1];--bf[0];
- nt[bf[0]].pb(mk(bf[2],bf[1]));nt[bf[1]].pb(mk(bf[2],bf[0]));
- }
- add(mk(0,0));d[0]=0;p[0]=-1488;
- for (int i=0;i<n;++i) {
- pii v=pop_top();
- for (int j=0;j<nt[v.S].size();++j) {
- pii to=nt[v.S][j];
- if (d[to.S]==-1 || d[to.S]>d[v.S]+to.F) {
- d[to.S]=(d[to.S]==-1)? v.F+to.F : v.F+to.F;
- p[to.S]=v.S;
- to.F=d[to.S];
- add(to);
- }
- }
- }
- n-=1;
- vector<int>ans;
- while (p[n]!=-1488) {
- //printf("%d ",n+1);
- ans.pb(n+1);
- n=p[n];
- }
- //puts("1");
- ans.pb(1);
- reverse(ans.begin(),ans.end());
- for (int i=0;i<ans.size();++i) {
- printf("%d ",ans[i]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement