-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathassignment_8 (1).cpp
More file actions
92 lines (85 loc) · 2.26 KB
/
assignment_8 (1).cpp
File metadata and controls
92 lines (85 loc) · 2.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>>graph;
map<pair<int,int>,int>mp;
map<int,bool>visited;
vector<vector<int>>ans;
map<int,bool>vis;
map<int,int>dis;
int src,dst;
void dfs(int node,vector<int>path,int prev,int length,bool flag){
cout << node << "\n";
visited[node]=true;
path.push_back(node);
if(flag==0 && vis[node]==1){
return;
}
else if(vis[node]!=1){
flag = 1;
}
if(node==dst){
visited[node]=false;
for(int i=0;i<path.size();i++){
vis[path[i]]=1;
}
ans.push_back(path);
return ;
}
for(int i=0;i<graph[node].size();i++){
dfs(graph[node][i],path,node,length+mp[{node,graph[node][i]}],0);
}
return;
}
int main(){
cout<<"Enter number of nodes : ";
int n; cin>>n;
graph.resize(n+1);
cout<<"Enter number of edges : ";
int m; cin>>m;
cout<<"Enter source node :";
cin>>src;
cout<<"Enter destination node : ";
cin>>dst;
cout<<"Now enter {node 1, node 2, edge length } : \n";
vis[dst]=1;
for(int i=0;i<m;i++){
int x,y,e; cin>>x>>y>>e;
graph[x].push_back(y);
mp[{x,y}]=e;
}
dfs(src,{},-1,0,1);
vector<int>answer;
for(int i=0;i<ans.size();i++){
int cnt=0;
for(int j=1;j<ans[i].size();j++){
cnt+=mp[{ans[i][j-1],ans[i][j]}];
}
answer.push_back(cnt);
}
int mn_path=INT_MAX,sec_mn=INT_MAX,sec_idx=-1,mnidx=-1;
for(int i=0;i<answer.size();i++){
if(answer[i]<mn_path){
sec_mn=mn_path;
sec_idx=mnidx;
mnidx=i;
mn_path=answer[i];
}
else if(answer[i]<sec_mn){
sec_mn=answer[i];
sec_idx=i;
}
}
cout << mn_path << " " << mnidx << " " << sec_mn << " " << sec_idx << "\n";
cout<<"Shortest path : ";
for(int i=0;i<ans[mnidx].size();i++){
cout<<ans[mnidx][i]<<" ";
}
cout<<"\nSecond option : ";
if(sec_mn!=mn_path+1 || sec_idx==-1) cout<<"Doesn't exist \n";
else {
for(int i=0;i<ans[sec_idx].size();i++){
cout<<ans[sec_idx][i]<<" ";
}
cout << endl;
}
}