1. 程式人生 > >洛谷——U10206 Cx的治療

洛谷——U10206 Cx的治療

編寫程序 未來 esp 嚴重 div org return style oid

https://www.luogu.org/problem/show?pid=U10206

題目背景

「Cx的故事」眾所周知,Cx是一個宇宙大犇。由於Cx在空中花園失足摔下,導致他那蘊含著無窮智慧的大腦受到了嚴重的損傷,許多的腦神經斷裂。於是,Cx的wife(有麽?)決定請巴比倫最好的醫師治療。但是,Cx的wife是個十分吝嗇的人,雖然她想將Cx治好,但是她又不肯出過多的錢,而腦神經的重新連接需要大量的花費。所以,當她知道來自未來的你時,她懇求你去幫她計算一下如何才能將Cx的神經元全部重新連接起來,而花費最小。

題目描述

神經網絡就是一張無向圖,圖中的節點稱為神經元,神經元已經按照1~N的順序排好號,而且兩個神經元之間至多有一條腦神經連接。

現有N個神經元,M條仍然完好的腦神經,連接神經元Ai與Bi。

醫生給出能夠連接的t條腦神經,分別連接神經元Aj與Bj,並給出連接所需的花費Ci。

請編寫程序計算將所有神經元連通的最小花費w。

輸入輸出格式

輸入格式:

第一行為兩個整數N,M (1<=N<=10000,1<=M<=100000) 表示一共有N個神經元,有M條依舊完好的腦神經。

接下來M行每行有兩個整數Ai,Bi (1<=Ai,Bi<=10000) 表示神經元Ai,Bi已經連在一起。

接下來一行有一個整數t (1<=t<=10000)表示醫生能連接的神經個數。

接下來t 行有三個整數 Aj ,Bj ,Cj (1<=Ai,Bi,Cj<=10000) 表示神經元Aj,Bj能通過Cj的花費將其連在一起。

輸出格式:

僅一行,為一個整數,表示將Cx的神經元連通起來的最小花費w。若不能將其全部連通,請輸出-1。

輸入輸出樣例

輸入樣例#1:
10 5
1 5
2 6
3 7
3 8
3 9
10
2 4 10
3 6 15
2 4 9
2 6 34
5 7 64
2 8 26
3 7 16
5 2 7
3 9 13
8 5 12
輸出樣例#1:
-1
輸入樣例#2:
10 5
1 5
2 6
3 7
3 8
3 9
10
8 10 10
3 6 15
2 4 9
2 6 34
5 7 64
2 8 26
3 7 16
5 2 7
3 9 13
8 5 12
輸出樣例#2:
38

說明

1<=N<=10000,0<=M<=100000;

1<=Ai,Bi,Aj,Bj<=10000;

1<=Cj<=100000;

1<=t<=100000;

 1 #include <algorithm>
 2 #include <cstdio>
 3 
 4 #define LL long long
 5 
 6 using namespace std;
 7 
 8 const int N(10000+15);
 9 const int M(100000+5);
10 int n,m,u,v,w;
11 
12 int cnt;
13 struct Edge
14 {
15     int u,v;
16     LL w;
17     Edge(int u=0,int v=0,LL w=0):
18         u(u),v(v),w(w){}
19 }edge[M<<2];
20 void ins(int u,int v,int w)
21 {
22     edge[++cnt]=Edge(u,v,(LL)w);
23 }
24 
25 LL ans;
26 int flag,num,fa[N];
27 bool cmp(Edge a,Edge b)
28 {
29     return a.w<b.w;
30 }
31 int find(int x)
32 {
33     return x==fa[x]?x:fa[x]=find(fa[x]);
34 }
35 void K()
36 {
37     for(int i=1;i<=n;i++) fa[i]=i;
38     sort(edge+1,edge+cnt+1,cmp);
39     for(int i=1;i<=cnt;i++)
40     {
41         int fx=find(edge[i].u),fy=find(edge[i].v);
42         if(fx==fy) continue;
43         num++;
44         fa[fx]=fy;
45         ans+=edge[i].w;
46         if(num==n-1)
47         {
48             flag=1;
49             return ;
50         }
51     }
52 }
53 
54 int main()
55 {
56     scanf("%d%d",&n,&m);
57     for(int i=1;i<=m;i++)
58     {
59         scanf("%d%d",&u,&v);
60         ins(u,v,w);ins(v,u,w);
61     }
62     scanf("%d",&m);
63     for(int i=1;i<=m;i++)
64     {
65         scanf("%d%d%d",&u,&v,&w);
66         ins(u,v,w); ins(u,v,w);
67     }
68     K();
69     if(!flag) puts("-1");
70     else printf("%lld\n",ans);
71     return 0;
72 }

洛谷——U10206 Cx的治療