Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- const int N = 100005;
- struct data
- {
- int u,v,w;
- };
- int n,s,t,res,trace[N];
- int m =1;
- data a[N];
- vector<int> b[N];
- bool mark[N];
- queue<int> st;
- int root[N];
- bool ispath=false;
- vector < data > kq;
- bool cmp(data a, data b)
- {
- return a.w > b.w;
- }
- int getRoot (int u)
- {
- return (root[u]) ? root[u] = getRoot(root[u]) : u;
- }
- void kruskal()
- {
- sort(a+1,a+1+m,cmp);
- memset(root, 0, sizeof(root));
- for(int i=1; i<=m; i++)
- {
- int p = getRoot(a[i].u);
- int q = getRoot(a[i].v);
- if (q != p)
- {
- b[a[i].u].push_back(a[i].v);
- b[a[i].v].push_back(a[i].u);
- root[p]=q;
- res = a[i].w;
- if (getRoot(s)==getRoot(t)) {ispath=true;break;}
- }
- }
- if (!ispath) cout << 0 << endl;
- }
- void bfs()
- {
- mark[s]=true;
- st.push(s);
- while (!st.empty())
- {
- int u = st.front();
- st.pop();
- for(int v : b[u])
- {
- if (!mark[v])
- {
- mark[v]=true;
- trace[v]=u;
- st.push(v);
- }
- }
- }
- }
- void ghi()
- {
- stack<int> res;
- while (t != 0)
- {
- res.push(t);
- t = trace[t];
- }
- while (res.size())
- {
- int v = res.top();
- res.pop();
- cout << v << endl;
- }
- }
- signed main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);cout.tie(0);
- freopen("hight.inp","r",stdin);
- cin >> n >> s >> t;
- while (cin >> a[m].u >> a[m].v >> a[m].w) ++m;
- kruskal();
- if (!ispath) return 0;
- bfs();
- //cout << s << " " << t << endl;
- cout << res << endl;
- ghi();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement