Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<vector>
- #include<algorithm>
- #include<queue>
- using namespace std;
- int set[1010];
- struct edge{
- int u,v,w;
- };
- bool mycmp(edge a,edge b){
- return a.w < b.w;
- }
- int find(int x){
- if(set[x] == x)return x;
- return set[x] = find(set[x]);
- }
- void unions(int x,int y){
- int sx = find(x);
- int sy = find(y);
- set[sx] = sy;
- }
- int max(int a,int b){
- return (a > b ? a : b);
- }
- int main()
- {
- for(int i=0;i<1010;i++)set[i] = i;
- int n,m;
- scanf("%d %d",&n,&m);
- vector<edge> edges;
- vector<pair<int,int> > adj[n+1];
- for(int i=0;i<m;i++){
- int u,v,w;
- scanf("%d %d %d",&u,&v,&w);
- edges.push_back({u,v,w});
- adj[u].push_back({w,v});
- adj[v].push_back({w,u});
- }
- sort(edges.begin(),edges.end(),mycmp);
- int MST = 0;
- int maxw = 0;
- for(int i=0;i<edges.size();i++){
- int u = edges[i].u;
- int v = edges[i].v;
- int w = edges[i].w;
- if(find(u) != find(v)){
- unions(u,v);
- MST += w;
- maxw = max(maxw,w);
- }
- }
- int MBST = 0;
- bool visited[n+1];for(int i=0;i<=n;i++)visited[i] = false;
- queue<int> q;
- q.push(1);
- while(!q.empty()){
- int u = q.front();
- q.pop();
- if(visited[u]){
- // printf("Test %d\n",u);
- MBST = 1;
- break;
- }else{
- visited[u] = true;
- for(int i=0;i<adj[u].size();i++){
- int v = adj[u][i].second;
- int w = adj[u][i].first;
- if(w <= maxw && !visited[v]){
- // printf("Test pushed %d\n",v);
- q.push(v);
- }
- }
- }
- }
- printf("%d %d",MST,MBST);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement