zoukankan      html  css  js  c++  java
  • hdu 1879 继续畅通project

    本题链接:点击打开链接

    本题大意:

            输入n行数据。每行数据前两个表示该条路连通的两个村庄的编号,第三个表示修该条路的成本。最后的0或1表示该路未修或已修过,求在此道路基础上要使道路畅通的最小成本。

    解题思路:

            本题基本上也是使用的kruskal算法,仅仅是多加了一个道路状态,无论该路已修或未修,都要把它连到树上。然后就是看加不加成本的问题。

    抑或採取一种方法。当道路已修。直接把成本改为0。然后依照常规kruskal算法写就可以;本代码未用此法,详细请參见代码:

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int per[110];
    int n;
    struct node{
    	int u,v,w,p;
    }a[5000];
    int cmp(node a,node b)
    {
    	return a.w<b.w;
    }
    void init()
    {
    	for(int i=1;i<=n;i++)
    		per[i]=i;
    }
    int find(int x)
    {
    	if(x==per[x])
    		return x;
    	else
    		return per[x]=find(per[x]);
    }
    int join(node a[],int m)
    {
    	int sum=0;
    	for(int i=0;i<m;i++)
    	{
    		int fx=find(a[i].u);
    		int fy=find(a[i].v);
    		if(fx!=fy)
    		{
    			per[fx]=fy;
    			if(!a[i].p)
    				sum+=a[i].w;
    		}
    	}
    	return sum;
    }
    int main()
    {
    	while(scanf("%d",&n)!=EOF&&n)
    	{
    		int m=n*(n-1)/2;
    		init();
    		for(int i=0;i<m;i++)
    		{
    			scanf("%d%d%d%d",&a[i].u,&a[i].v,&a[i].w,&a[i].p);
    			if(a[i].p)
    			{
    				int fx=find(a[i].u);
    				int fy=find(a[i].v);
    				if(fx!=fy)
    					per[fx]=fy;
    			}
    		}					
    		sort(a,a+m,cmp);
    		printf("%d
    ",join(a,m));
    	}
    	return 0;
    }


     

  • 相关阅读:
    poj3273Monthly Expense
    poj2516Minimum Cost
    poj1201Intervals(差分约束)
    poj3122Pie
    poj3258River Hopscotch
    hdu3308LCIS(线段树区间合并)
    CF1178F2 Long Colorful Strip
    CF906C Party
    [NOI2002]贪吃的九头龙
    CF1178F1 Short Colorful Strip
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6891256.html
Copyright © 2011-2022 走看看