http://acm.hdu.edu.cn/showproblem.php?pid=1879
这道题可以把已修建的道路的费用置为0,然后用prim和kruskal都可以求出。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 20000 5 using namespace std; 6 7 int u[maxn],v[maxn],r[maxn],s[maxn],f[maxn],w[maxn]; 8 int dis[maxn]; 9 bool vis[maxn]; 10 int sum=0,n; 11 int cmp(const int i,const int j) {return w[i]<w[j];} 12 int Find(int x) {return f[x]==x?x:f[x]=Find(f[x]);} 13 14 int main() 15 { 16 while(scanf("%d",&n)!=EOF) 17 { 18 memset(u,0,sizeof(u)); 19 memset(v,0,sizeof(v)); 20 memset(s,0,sizeof(s)); 21 if(n==0) break; 22 sum=0; 23 for(int i=0; i<n*(n-1)/2; i++) 24 { 25 scanf("%d%d%d%d",&u[i],&v[i],&w[i],&s[i]); 26 if(s[i]==1) w[i]=0; 27 } 28 for(int i=0; i<=n; i++) f[i]=i; 29 for(int i=0; i<n*(n-1)/2; i++) r[i]=i; 30 sort(r,r+n*(n-1)/2,cmp); 31 for(int i=0; i<n*(n-1)/2; i++) 32 { 33 int e=r[i]; int x=Find(u[e]); int y=Find(v[e]); 34 if(x!=y) 35 { 36 sum+=w[e]; 37 f[x]=y; 38 } 39 } 40 printf("%d ",sum); 41 } 42 return 0; 43 }