联络员(信息学奥赛一本通-T1393)
【題目描述】
Tyvj已經(jīng)一歲了,網(wǎng)站也由最初的幾個用戶增加到了上萬個用戶,隨著Tyvj網(wǎng)站的逐步壯大,管理員的數(shù)目也越來越多,現(xiàn)在你身為Tyvj管理層的聯(lián)絡(luò)員,希望你找到一些通信渠道,使得管理員兩兩都可以聯(lián)絡(luò)(直接或者是間接都可以)。Tyvj是一個公益性的網(wǎng)站,沒有過多的利潤,所以你要盡可能的使費(fèi)用少才可以。
目前你已經(jīng)知道,Tyvj的通信渠道分為兩大類,一類是必選通信渠道,無論價格多少,你都需要把所有的都選擇上;還有一類是選擇性的通信渠道,你可以從中挑選一些作為最終管理員聯(lián)絡(luò)的通信渠道。數(shù)據(jù)保證給出的通行渠道可以讓所有的管理員聯(lián)通。
【輸入】
第一行n,m表示Tyvj一共有n個管理員,有m個通信渠道;
第二行到m+1行,每行四個非負(fù)整數(shù),p,u,v,w 當(dāng)p=1時,表示這個通信渠道為必選通信渠道;當(dāng)p=2時,表示這個通信渠道為選擇性通信渠道;u,v,w表示本條信息描述的是u,v管理員之間的通信渠道,u可以收到v的信息,v也可以收到u的信息,w表示費(fèi)用。
【輸出】
最小的通信費(fèi)用。
【輸入樣例】
5 6
1 1 2 1
1 2 3 1
1 3 4 1
1 4 1 1
2 2 5 10
2 2 5 5
【輸出樣例】
9
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<set> #include<map> #include<stack> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 10001 #define MOD 123 #define E 1e-6 using namespace std; int father[N]; struct Node{int p;int u;int v;int w; }g[N*N]; int cmp(Node a,Node b) {if(a.p==2&&b.p==2)return a.w<b.w;return a.p<b.p; } int Find(int x) {if(father[x]==x)return x;return father[x]=Find(father[x]); } int Union(int x,int y) {x=Find(x);y=Find(y);if(x!=y){father[y]=x;return 1;}return 0; } int main() {int n,m;cin>>n>>m;for(int i=1;i<=n;i++)father[i]=i;for(int i=1;i<=m;i++)cin>>g[i].p>>g[i].u>>g[i].v>>g[i].w;sort(g+1,g+1+m,cmp);int sum=0;for(int i=1;i<=m;i++){if(g[i].p==1){sum+=g[i].w;Union(g[i].u,g[i].v);}else if(g[i].p==2){if(Union(g[i].u,g[i].v))sum+=g[i].w;}}cout<<sum<<endl;return 0; }?
總結(jié)
以上是生活随笔為你收集整理的联络员(信息学奥赛一本通-T1393)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 组合的输出(信息学奥赛一本通-T1317
- 下一篇: 最优乘车(信息学奥赛一本通-T1377)