intmain(){ cin>>n>>m; for(int i = 0 ; i < m; i++){ int a, b, w; scanf("%d%d%d", &a, &b, &w); edges[i] = {w, {a, b}}; } sort(edges, edges+m); for(int i = 0; i <= n; i++) p[i] = i; int ans = 0, cnt = 0; for(int i = 0; i < m; i++){ int a = edges[i].second.first, b = edges[i].second.second; a = find(a), b = find(b); if(a != b){ p[a] = b; ans += edges[i].first; cnt++; } } if(cnt < n-1) puts("impossible"); else cout<<ans; }
二分图
二分图的定义:一个图是二分图当且仅当图中不含奇数个节点构成的环
染色法判断二分图
实现:
使用深度优先搜索遍历整个图
对遍历到的节点进行间隔染色一步红一步黑
发现已经染色并且颜色和需要期待染的相同则意味着目前出现了奇数环
核心代码:
1 2 3 4 5 6 7 8 9 10 11 12
booldfs(int u, int c){ color[u] = c; for(int i = h[u]; ~i; i = ne[i]){ int j = e[i]; if(!color[j]){ if(!dfs(j, -c)) returnfalse; } elseif(color[j] == c) returnfalse; } returntrue; }