HDU1102
除了题面没说多组数据比较坑以外,别的就是裸mst
已经建的路直接节点合并即可
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 struct node{ 5 int from,to,w; 6 bool operator < (const node & a){ 7 return w<a.w; 8 } 9 }a[10001]; 10 int f[101],d[101][101]; 11 int n,w,m=0,ans=0,u,v,t; 12 13 void ini(){ 14 for (int i=1;i<=n;i++) f[i]=i; 15 m=ans=0; 16 } 17 18 int getf(int u){ 19 return f[u]==u?f[u]:f[u]=getf(f[u]); 20 } 21 22 void merge(int u,int v){ 23 f[getf(u)]=getf(v); 24 } 25 26 void solve() 27 { 28 while (cin>>n){ 29 ini(); 30 for (int i=1;i<=n;i++){ 31 for (int j=1;j<=n;j++){ 32 cin>>d[i][j]; 33 a[++m]={i,j,d[i][j]}; 34 } 35 } 36 cin>>t; 37 for (int i=1;i<=t;i++){ 38 cin>>u>>v; 39 merge(u,v); 40 } 41 sort(a+1,a+1+m); 42 for (int i=1;i<=m;i++){ 43 if (getf(a[i].from)!=getf(a[i].to)){ 44 ans+=a[i].w; 45 merge(a[i].from,a[i].to); 46 } 47 } 48 cout<<ans<<endl; 49 } 50 } 51 52 int main() 53 { 54 solve(); 55 return 0; 56 }

浙公网安备 33010602011771号