Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:MST是否唯一,,KruskalIn Reply To:MST是否唯一,,Kruskal Posted by:lvweihua at 2017-07-25 18:17:34 > #include<cstdio> > #include<cstring> > #include<algorithm> > using namespace std; > > const int MAXN = 101; > const int MAXM = 10000; > int parent[MAXN]; > bool first; > int N, M; > struct Edge > { > int u, v, w; > int used; //第一次是否使用过 > int del; //是否被删除 > int equ; //是否有相等边的标记 > }edge[MAXM]; > > void UFset() > { > memset(parent, -1, sizeof(parent)); > } > > int Find(int x) > { > int s; > for (s = x;parent[s] >= 0;s = parent[s]); > while (s != x) > { > int tmp = parent[x]; > parent[x] = s; > x = tmp; > } > return s; > } > > void Union(int x, int y) > { > int r1 = Find(x), r2 = Find(y); > int sum = parent[r1] + parent[r2]; > if (parent[r1] < parent[r2]) > { > parent[r1] = sum; > parent[r2] = r1; > } > else > { > parent[r2] = sum; > parent[r1] = r2; > } > } > > int Kruskal() > { > int sumWidget = 0; > int num = 0; > UFset(); > for (int i = 0;i < M;i++) > { > if (Find(edge[i].u) != Find(edge[i].v) && !edge[i].del) > { > Union(edge[i].u, edge[i].v); > num++; > sumWidget += edge[i].w; > if (first)edge[i].used = 1; > } > if (num >= N - 1) > break; > } > return sumWidget; > } > > int main() > { > int t; > scanf("%d", &t); > while (t--) > { > scanf("%d%d", &N, &M); > //输入并且初始化 > for (int i = 0;i < M;i++) > { > scanf("%d%d%d", &edge[i].u, &edge[i].v, &edge[i].w); > edge[i].equ = edge[i].used = edge[i].del = 0; > } > for (int i = 0;i < M - 1;i++) > { > if (edge[i].equ == 1)continue; > for (int j = 0;j < N;j++) > { > if (edge[i].w == edge[j].w) > edge[i].equ = edge[j].equ = 1; > } > } > first = true; > int w1 = Kruskal(), w2; > first = false; > int i; > for (i = 0;i < M;i++) > { > if (edge[i].used&&edge[i].equ) > { > edge[i].del = 1; > w2 = Kruskal(); > if (w2 == w1) > { > printf("Not Unique!\n"); > break; > } > edge[i].del = 0; > } > } > if (i >= M) > printf("%d\n", w1); > } > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator