Advertisement
Guest User

Untitled

a guest
Jan 20th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define DIM 100009
  6. #define INF 100000000000009
  7.  
  8. struct edge{
  9. long long to,mas,num;
  10. };
  11.  
  12. long long a[DIM],b[DIM],c[DIM],road[DIM];
  13.  
  14. pair<long long,long long>way[DIM];
  15.  
  16. vector<long long>res;
  17.  
  18. vector<edge>g[DIM];
  19.  
  20. priority_queue< pair<long long,long long>,vector< pair<long long,long long> >,greater< pair<long long,long long> > >q;
  21.  
  22. long long n,m,i,j,k,l,start,finish,x,y,v,money,kilkroad;
  23.  
  24. int main()
  25. {
  26. cin>>n>>m;
  27. for(i=1;i<=n;i++){
  28. cin>>c[i];
  29. }
  30.  
  31. start=1;finish=n;
  32.  
  33. for(i=1;i<=m;i++){
  34. cin>>k>>l>>j>>v;
  35. if(j==1){
  36. money+=v;
  37. road[i]=1;
  38. }
  39. // cout<<v<<' '<<money<<' '<<j<<' '<<finish<<' '<<1<<endl;
  40. g[k].push_back({l,l+c[j],i});
  41. g[l].push_back({k,k+c[j],i});
  42. }
  43. memset(a,0,sizeof(a));
  44. for(i=0;i<DIM-4;i++)b[i]=INF;
  45. b[start]=0;
  46. q.push({0,start});
  47. long long w;
  48. while(!q.empty()){
  49. v=q.top().second;
  50. q.pop();
  51. if(a[v]==1)continue;
  52. a[v]=1;
  53. for(i=0;i<g[v].size();i++){
  54. x=g[v][i].to;
  55. y=g[v][i].mas;
  56. w=g[v][i].num;
  57. if(b[x]>b[v]+y){
  58. b[x]=b[v]+y;
  59. way[x]={v,w};
  60. q.push({b[x],x});
  61. }
  62. }
  63. }
  64.  
  65. w=finish;
  66. // cout<<b[finish]<<' '<<money<<endl;
  67. if(b[finish]>money){
  68. cout<<-1<<endl;
  69. return 0;
  70. }
  71.  
  72. while(w!=1){
  73. res.push_back(w);
  74. road[way[w].second]+=2;
  75. w=way[w].first;
  76. }
  77.  
  78. res.push_back(1);
  79.  
  80. reverse(res.begin(),res.end());
  81.  
  82. for(i=1;i<=m;i++){
  83. if(road[i]==1)kilkroad++;
  84. }
  85. cout<<kilkroad<<' ';
  86. for(i=1;i<=m;i++){
  87. if(road[i]==1){
  88. cout<<i<<' ';
  89. }
  90. }
  91. cout<<endl;
  92. kilkroad=0;
  93. for(i=1;i<=m;i++)
  94. if(road[i]==2)kilkroad++;
  95.  
  96. cout<<kilkroad<<' ';
  97.  
  98. for(i=1;i<=m;i++){
  99. if(road[i]==2)cout<<i<<' ';
  100. }
  101.  
  102. cout<<endl;
  103.  
  104. for(i=0;i<res.size();i++){
  105. cout<<res[i]<<' ';
  106. }
  107. cout<<endl;
  108. return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement