Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<vector>
- #include<queue>
- using namespace std;
- struct inqueue{
- int u;
- int d;
- vector<int> path;
- bool operator <(const inqueue& rhs)const
- {
- return d > rhs.d;
- }
- };
- typedef struct{
- int w;
- int v;
- }edge;
- int main()
- {
- int n,m,siz;
- scanf("%d %d %d",&n,&m,&siz);
- int sour,dest;
- scanf("%d %d",&sour,&dest);
- vector<edge> adj[n];
- for(int i=0;i<m;i++){
- int u,v,w;
- scanf("%d %d %d",&u,&v,&w);
- if(w > siz){
- adj[u].push_back({w,v});
- adj[v].push_back({w,u});
- }
- }
- priority_queue<inqueue> pq;
- int dist[n];for(int i=0;i<n;i++)dist[i] = 2e9;
- bool visited[n];for(int i=0;i<n;i++)visited[i] = false;
- pq.push({sour,0,vector<int> ()});
- dist[sour] = 0;
- vector<int> anspath;
- while(!pq.empty()){
- int u = pq.top().u;
- vector<int> tpath = pq.top().path;
- pq.pop();
- if(!visited[u]){
- visited[u] = true;
- tpath.push_back(u);
- if(u == dest){
- // anspath = tpath;
- for(int i=0;i<tpath.size();i++){
- anspath.push_back(tpath[i]);
- }
- }
- for(int i=0;i<adj[u].size();i++){
- int v = adj[u][i].v;
- int w = adj[u][i].w;
- if(!visited[v] && dist[u] + w < dist[v]){
- dist[v] = dist[u] + w;
- pq.push({v,dist[v],tpath});
- }
- }
- }
- }
- int q;
- scanf("%d",&q);
- if(q == 1){
- if(dist[dest] == 2e9){
- printf("-1");
- }
- else{
- printf("%d",dist[dest]);
- }
- }else{
- if(dist[dest] == 2e9){
- printf("-1");
- }
- else{
- printf("%d\n",dist[dest]);
- printf("%d\n",anspath.size());
- for(int i=0;i<anspath.size();i++){
- printf("%d ",anspath[i]);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment