HDU 3080 The plan of city rebuild

来源:互联网 发布:淘宝儿童服装店哪个好 编辑:程序博客网 时间:2024/05/16 09:28
   这道题用的是最小生成树中的kruskal算法,这题输入比较烦, 要注意去掉的点的处理。
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <iostream>#include <algorithm>#define mem(a) memset(a, 0, sizeof(a))using namespace std;int father[10005], son[10005], nump, nume, numnp, numne, numds;bool vis[10005];struct eg{int a;int b;int egv;}e[60000];bool cmp(const eg & a, const eg & b)  {      return a.egv < b.egv;  } int research(int a){if(a == father[a])return a;else{research(father[a]);}}bool join(int a, int b){int root1, root2;root1 = research(a);root2 = research(b);if(root1 == root2)return false;else if(son[root1] >= son[root2]){    father[root2] = root1;    son[root1] += son[root2];}else{         father[root1] = root2;         son[root2] += son[root1];}return true;}int main(int argc, char *argv[]){int t, i, j, k, flag, num, nn;long long ans;scanf("%d", &t);while(t--){nn = 0;num = 0;ans = 0;flag = 0;mem(father);mem(son);mem(vis);mem(e);scanf("%d%d", &nump, &nume);for(i = 0;i < nume;i++){scanf("%d%d%d",&e[i].a, &e[i].b, &e[i].egv);}scanf("%d%d", &numnp, &numne);for(i = nume;i < (nume + numne);i++){scanf("%d%d%d",&e[i].a, &e[i].b, &e[i].egv);}scanf("%d",&numds);for(i = 0;i < numds;i++){scanf("%d",&j);vis[j] = 1;}for(i = 0;i < (nume + numne);i++){if(vis[e[i].a] == 1||vis[e[i].b] == 1)e[i].egv = -1, nn++;}sort(e, e + nume + numne, cmp);for(i = 0;i < (nump + numnp);i++){father[i] = i;son[i] = 1;}for(i = nn;i < (nume + numne);i++){    if(join(e[i].a, e[i].b))    {        num++;        ans += e[i].egv;    }    if(num == (nump + numnp - numds - 1))    {        flag = 1;        break;    }}if(flag == 1)printf("%lld\n", ans);elseprintf("what a pity!\n");}return 0;}

0 0