这是最小生成树的变种,我们可以首先将的连接上,然后给剩余的边排序。需要注意排序后,索引信息回发生改变,需要保存好。然后依次检测联通性,如果不联通我们才连接。
连通性可以使用并查集来实现。
import sys
sys.setrecursionlimit(100010)
read = sys.stdin.readline
if __name__ == "__main__":
import sys
sys.setrecursionlimit(100010)
read = sys.stdin.readline
if __name__ == "__main__":
n,m = map(int,read().split())
fa = list(range(n))
def find(x: int):
if x != fa[x]:
fa[x] = find(fa[x])
return fa[x]
edges = []
vis = [False] * m
for i in range(m):
u,v,w,p = map(int,read().split())
u -= 1
v -= 1
if p == 1:
vis[i] = True
f1 = find(u)
f2 = find(v)
fa[f1] = f2
else:
edges.append((w,u,v,i))
edges.sort()
for w,u,v,idx in edges:
f1 = find(u)
f2 = find(v)
if f1 != f2:
fa[f1] = f2
vis[idx] = True
cnt = 0
for i in range(n):
if i == find(i):
cnt += 1
if cnt > 1:
print(-1)
exit(0)
print(sum(vis))
for i in range(m):
if vis[i]:
print(i + 1,end = " ")
print()