Advertisement
Guest User

Untitled

a guest
May 24th, 2015
419
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. #define FOR(i,a,b) for(auto i=a; i!=b+1-2*(a>b); i+=1-2*(a>b))
  4. #define REP(i,a,b) for(auto i=a-(a>b); i!=b-(a>b); i+=1-2*(a>b))
  5. #define ALL(v) v.begin(),v.end()
  6. #define what_is(x) cout<<#x<<" is "<<x<<endl;
  7. #define min3(a,b,c) min(min(a,b),c)
  8. #define max3(a,b,c) max(max(a,b),c)
  9. #define SIZE 300010
  10. #define MAXN 1000010
  11. #define PI 3.141592653589793
  12. #define open_read1 freopen("C:\\Users\\Hepic\\Desktop\\a.txt","r",stdin)
  13. #define open_write1 freopen("C:\\Users\\Hepic\\Desktop\\b.txt","w",stdout)
  14. #define open_read freopen("rblock.in","r",stdin)
  15. #define open_write freopen("rblock.out","w",stdout)
  16.  
  17. using namespace std;
  18.  
  19.  
  20. typedef long long LL;
  21. typedef pair<int,int> PII;
  22.  
  23.  
  24. struct info
  25. {
  26.     int nde,edge_id;
  27.     LL dst;
  28.  
  29.     bool friend operator < (const info &in1, const info &in2)
  30.     {
  31.         return in1.dst > in2.dst;
  32.     }
  33. };
  34.  
  35.  
  36. int N,M,A,B,stNode,cnt;
  37. int node,Tid;
  38. int conn_node,conn_id;
  39. bool visited[SIZE];
  40. LL dist,conn_dist,whole_dist,min_cost,C;
  41. LL min_dist[SIZE], edge_cost[SIZE];
  42. set<PII> keep_edges;
  43. vector<info> tree[SIZE];
  44. priority_queue<info> que;
  45.  
  46.  
  47. void dijkstra(int starting_node)
  48. {
  49.     REP(i,0,SIZE)
  50.     {
  51.         visited[i] = false;
  52.         min_dist[i] = -1;
  53.     }
  54.  
  55.     que.push( info{starting_node, -1, 0} );
  56.  
  57.  
  58.     while(!que.empty())
  59.     {
  60.         node = que.top().nde;
  61.         dist = que.top().dst;
  62.         Tid = que.top().edge_id;
  63.         que.pop();
  64.  
  65.  
  66.         if(min_dist[node] == -1  ||  dist < min_dist[node])
  67.         {
  68.             min_dist[node] = dist;
  69.  
  70.             if(Tid != -1)
  71.                 keep_edges.insert( make_pair(node, Tid) );
  72.         }
  73.  
  74.         else if(min_dist[node] == dist)
  75.         {
  76.             auto itr = lower_bound( ALL(keep_edges), make_pair(node, -1) );
  77.  
  78.             if(edge_cost[Tid] < edge_cost[itr->second])
  79.             {
  80.                 keep_edges.erase(itr);
  81.                 keep_edges.insert( make_pair(node, Tid) );
  82.             }
  83.         }
  84.  
  85.  
  86.         if(visited[node] == true)
  87.             continue;
  88.  
  89.         visited[node]=true;
  90.  
  91.  
  92.         REP(i,0,tree[node].size())
  93.         {
  94.             conn_node  = tree[node][i].nde;
  95.             conn_dist = tree[node][i].dst;
  96.             conn_id = tree[node][i].edge_id;
  97.  
  98.             whole_dist = dist + conn_dist;
  99.  
  100.             if(!visited[conn_node])
  101.                 que.push( info{conn_node, conn_id, whole_dist} );
  102.         }
  103.     }
  104. }
  105.  
  106.  
  107. int main()
  108. {
  109.     scanf("%d%d",&N,&M);
  110.  
  111.     for(int i=1; i<=M; ++i)
  112.     {
  113.         scanf("%d%d%I64d",&A,&B,&C);
  114.  
  115.         ++cnt;
  116.  
  117.         tree[A].push_back( info{B, cnt, C} );
  118.         tree[B].push_back( info{A, cnt, C} ) ;
  119.         edge_cost[cnt] = C;
  120.     }
  121.  
  122.     scanf("%d",&stNode);
  123.  
  124.  
  125.  
  126.     dijkstra(stNode);
  127.  
  128.     for(auto val:keep_edges)
  129.         min_cost += edge_cost[val.second];
  130.  
  131.  
  132.  
  133.     printf("%I64d\n",min_cost);
  134.  
  135.     for(auto val:keep_edges)
  136.         cout<<val.second<<" ";
  137.  
  138.     printf("\n");
  139.  
  140.  
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement