联络员(信息学奥赛一本通-T1393)
生活随笔
收集整理的這篇文章主要介紹了
联络员(信息学奥赛一本通-T1393)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
Tyvj已經一歲了,網站也由最初的幾個用戶增加到了上萬個用戶,隨著Tyvj網站的逐步壯大,管理員的數目也越來越多,現在你身為Tyvj管理層的聯絡員,希望你找到一些通信渠道,使得管理員兩兩都可以聯絡(直接或者是間接都可以)。Tyvj是一個公益性的網站,沒有過多的利潤,所以你要盡可能的使費用少才可以。
目前你已經知道,Tyvj的通信渠道分為兩大類,一類是必選通信渠道,無論價格多少,你都需要把所有的都選擇上;還有一類是選擇性的通信渠道,你可以從中挑選一些作為最終管理員聯絡的通信渠道。數據保證給出的通行渠道可以讓所有的管理員聯通。
【輸入】
第一行n,m表示Tyvj一共有n個管理員,有m個通信渠道;
第二行到m+1行,每行四個非負整數,p,u,v,w 當p=1時,表示這個通信渠道為必選通信渠道;當p=2時,表示這個通信渠道為選擇性通信渠道;u,v,w表示本條信息描述的是u,v管理員之間的通信渠道,u可以收到v的信息,v也可以收到u的信息,w表示費用。
【輸出】
最小的通信費用。
【輸入樣例】
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; }?
總結
以上是生活随笔為你收集整理的联络员(信息学奥赛一本通-T1393)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 组合的输出(信息学奥赛一本通-T1317
- 下一篇: 最优乘车(信息学奥赛一本通-T1377)