最小生成树练习

A - 还是畅通工程

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define clr(a) memset(a,0,sizeof(a))
#define line cout<<"----------------------"<<endl;

const int maxn = 1e6+10;
const int inf = 0x3f3f3f3f;
const int N = 1010;

int n,m;
ll ans ;
int pre[maxn];
struct node{
    int u,v,cost;
}p[maxn];

void init(){
    for(int i=0;i<=n;i++)
        pre[i] = i;
}
bool cmp(node a,node b){
    return a.cost < b.cost;
}
int find(int x){
    if(x == pre[x]) return x;
    else return pre[x] = find(pre[x]);
}
int main(){
    while(scanf("%d",&n)!=EOF&&n){
        clr(p);
        init();
        ans = 0;
        m = n * (n-1) / 2;
        int u,v,cost;
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&u,&v,&cost);
            p[i].u = u;p[i].v = v;p[i].cost = cost;
        }
        sort(p,p+m,cmp);
        for(int i=0;i<m;i++){
            int dx = find(p[i].u);
            int dy = find(p[i].v);
            if(dx != dy){
                pre[dy] = dx;
                ans += p[i].cost;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

B - Highways

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 999999
using namespace std;
int pre[100001];
int n,m;
struct node{
	int u,v;
	int value;
}p[300000];

void init(int n){
	for(int i=1;i<=n;i++){
		pre[i]=i;
	}
}

int find(int x){
	if(pre[x]==x) return x;
	return pre[x]=find(pre[x]);
}

bool cmp (node x,node y){
	return x.value<y.value;
}

void mix(int x,int y){
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy){
		pre[fy]=fx;
	}
}

int main(){
	int t,s;
	cin>>t;
	while(t--){
		scanf("%d",&n);
		init(n);
		int k=0;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				scanf("%d",&s);
				p[k].u =i;
				p[k].v =j;
				p[k++].value =s;
			}
		}
		sort(p,p+k,cmp);
		int dis=0;
		for(int i=0;i<k;i++){
			if(find(p[i].u)!=find(p[i].v)){
				if(p[i].value>dis)
				dis=p[i].value ;
				mix(p[i].u ,p[i].v );
			}
		}
		printf("%d\n",dis);
	}
	return 0;
}

 

C - Networking

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 999999
using namespace std;
int pre[100001];
int n,m;
struct node
{
	int u,v;
	int value;
}p[300000];

void init(int n)
{
	for(int i=1;i<=n;i++)
	{
		pre[i]=i;
	}
}

int find(int x)
{
	if(pre[x]==x) return x;
	return pre[x]=find(pre[x]);
}

bool cmp (node x,node y)
{
	return x.value<y.value;
}

void mix(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
	{
		pre[fy]=fx;
	}
}

int main()
{
	while(scanf("%d",&n)!=EOF&&n!=0)
	{
		memset(pre,0,sizeof(pre));
		scanf("%d",&m);
		init(n);
		if(m==0)
			printf("0\n");
		else
		{
			for(int i=0;i<m;i++)
			{
				scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].value);
			}
			int ans=0;
			sort(p,p+m,cmp);
			for(int i=0;i<m;i++)
			{
				int fx=find(p[i].u);
				int fy=find(p[i].v);
				if(fx!=fy)
				{
					pre[fy]=fx;
					ans+=p[i].value; 
				}
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}

D - 畅通工程

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int pre[111];
struct node
{
	int u,v;
	int value;
}p[111];

void init(int n)
{
	for(int i=1;i<=n;i++)
	{
		pre[i]=i;
	}
}

int find(int x)
{
	if(pre[x]==x) return x;
	return pre[x]=find(pre[x]);
}

bool cmp (node x,node y)
{
	return x.value<y.value;
}

void mix(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
	{
		pre[fy]=fx;
	}
}

int main()
{
	int  n,m,p1,p2;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		if(n==0)
			return 0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d%d",&p[i].u,&p[i].v,&p[i].value);
		}
		sort(p,p+n,cmp);
		int num=0,ans=0;
		init(n);
		for(int i=1;i<=n&&num<m-1;i++)
		{
			int fx=find(p[i].u);
			int fy=find(p[i].v);
			if(fx!=fy)
			{
				pre[fy]=fx;
				num++;
				ans+=p[i].value;
			}
		}
		if(num==m-1)
		{
			printf("%d\n",ans);
		}
		else
		{
			printf("?\n");
		}
	}
	return 0;
}

E - Highways

#include<cstdio>
#include<algorithm>
#include<cstring> 
#include<cmath>
using namespace std;
struct edge
{
	double x,y;
}da[800];
struct node
{
	int u,v;
	double dis;
}e[320000+11];
struct edge2
{
	int a,b;
}data[800];
int par[800],ran[800];
int vis[800][800];
int find(int m)
{
	if(m==par[m])
		return m;
	else
		return par[m]=find(par[m]);
}
void unite(int x,int y)
{
	int fx,fy;
	fx=find(x);
	fy=find(y);
	if(fx==fy)
		return ;
	if(ran[fx]<ran[fy])
		par[fx]=fy;
	else
	{
		par[fy]=fx;
		if(ran[fx]==ran[fy])
			ran[fx]++;
	}
}
bool cmp(node a,node b)
{
	return a.dis <b.dis ;
}
int main() 
{	
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=n;i++)
		{
			par[i]=i;
			ran[i]=0;
		}
		for(int i=1;i<=n;i++)
		{
			scanf("%lf%lf",&da[i].x,&da[i].y);
		}
		int m;
		scanf("%d",&m);
		for(int i=1;i<=m;i++)
		{
			int a,b;
			scanf("%d%d",&a,&b);
			vis[a][b]=1,vis[b][a]=1;
			unite(a,b);
		}
		int k=0;
		for(int i=1;i<n;i++)
		{
			for(int j=i+1;j<=n;j++)
			{
				e[k].u =i;
				e[k].v =j;
				double a=da[i].x -da[j].x ;
				double b=da[i].y -da[j].y ;
				e[k].dis =sqrt(a*a+b*b);
				k++;
			}
		}
		sort(e,e+k,cmp);
		int p=0;
		for(int i=0;i<k;i++)
		{
			if(vis[e[i].u][e[i].v])
				continue;	
			else 
			{
				if(find(e[i].u)!=find(e[i].v))
				{
					data[p].a =e[i].u ;
					data[p].b =e[i].v ;
					vis[e[i].u][e[i].v]=vis[e[i].v][e[i].u]=1;
					unite(e[i].u,e[i].v);
					p++;
				}		
			}
		}
		for(int i=0;i<p;i++)
		{
			printf("%d %d\n",data[i].a ,data[i].b ); 
		}
	} 
	return 0;
}

F - 畅通工程再续

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 99999
using namespace std;
int pre[MAX];
int n,m;
struct node
{
	int x,y;
}p[1000];

struct node1
{
	int x,y;
	double distance;
}pi[751*751];
void init(int n)
{
	for(int i=1;i<=n;i++)
	{
		pre[i]=i;
	}
}

int find(int x)
{
	if(pre[x]==x) return x;
	return pre[x]=find(pre[x]);
}

bool cmp (node1 x,node1 y)
{
	return x.distance<y.distance;
}

void mix(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
	{
		pre[fy]=fx;
	}
}

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		scanf("%d",&n);
		memset(pre,0,sizeof(pre));
		init(n);
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&p[i].x,&p[i].y);
		}
		int s=0;
		for(int i=1;i<n;i++)
		 {
		 	for(int j=i+1;j<=n;j++)
		 	{
		 		pi[s].x =i;
		 		pi[s].y =j;
		 		pi[s++].distance=sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
			 }
		 }
		 sort(pi,pi+s,cmp);
		 double ans=0;
		 for(int i=0;i<s;i++)
		 {
		 	if(find(pi[i].x )!=find(pi[i].y)&&(pi[i].distance<=1000)&&(pi[i].distance>=10))
		 	{
		 		ans+=pi[i].distance;
		 		mix(pi[i].x ,pi[i].y );
			 }
		 }
		 int flag=0;
		 for(int i=1;i<=n;i++)
		 {
		 	if(pre[i]!=pre[1])
		 	{
		 		flag=1;
			 }
		 }
		 if(flag==1)
		 {
		 	printf("oh!\n");
		 }
		 else
		 {
		 	printf("%.1lf\n",ans*100);
		 }
	}
	return 0;
}

G - Agri-Net

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 999999
using namespace std;
int pre[100001];
int n,m;
struct node
{
	int u,v;
	int value;
}p[300000];

void init(int n)
{
	for(int i=1;i<=n;i++)
	{
		pre[i]=i;
	}
}

int find(int x)
{
	if(pre[x]==x) return x;
	return pre[x]=find(pre[x]);
}

bool cmp (node x,node y)
{
	return x.value<y.value;
}

void mix(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
	{
		pre[fy]=fx;
	}
}

int main()
{
	int u,v;
	while(scanf("%d",&n)!=EOF)
	{
		int s;
		memset(pre,0,sizeof(pre));
		int k=0;
		init(n);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				scanf("%d",&s);
				p[k].u=i;
				p[k].v=j;
				p[k++].value=s;
			}
		}
		int t;
	/*	scanf("%d",&t);
		for(int i=1;i<=t;i++)
		{
			scanf("%d%d",&u,&v);
			mix(u,v);
		}*/
		sort(p,p+k,cmp);
		int dis=0;
		for(int i=0;i<k;i++)
		{
			if(find(p[i].u)!=find(p[i].v))
			{
				dis+=p[i].value;
				mix(p[i].u,p[i].v);
			}
		}
		printf("%d\n",dis);
	}
	return 0;
}

H - Constructing Roads

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 999999
using namespace std;
int pre[100001];
int n,m;
struct node
{
	int u,v;
	int value;
}p[300000];

void init(int n)
{
	for(int i=1;i<=n;i++)
	{
		pre[i]=i;
	}
}

int find(int x)
{
	if(pre[x]==x) return x;
	return pre[x]=find(pre[x]);
}

bool cmp (node x,node y)
{
	return x.value<y.value;
}

void mix(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy)
	{
		pre[fy]=fx;
	}
}

int main()
{
	int u,v;
	while(scanf("%d",&n)!=EOF)
	{
		int s;
		memset(pre,0,sizeof(pre));
		int k=0;
		init(n);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				scanf("%d",&s);
				p[k].u=i;
				p[k].v=j;
				p[k++].value=s;
			}
		}
		int t;
		scanf("%d",&t);
		for(int i=1;i<=t;i++)
		{
			scanf("%d%d",&u,&v);
			mix(u,v);
		}
		sort(p,p+k,cmp);
		int dis=0;
		for(int i=0;i<k;i++)
		{
			if(find(p[i].u)!=find(p[i].v))
			{
				dis+=p[i].value;
				mix(p[i].u,p[i].v);
			}
		}
		printf("%d\n",dis);
	}
	return 0;
}

I - Jungle Roads

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;  
int pre[27];  
struct node  
{  
    int u;  
    int v;  
    int distance;  
}p[80];  
bool cmp(node a, node b)  
{  
    return a.distance < b.distance;  
}  
int find(int x)
{
	if(pre[x]==x) return x;
	return pre[x]=find(pre[x]);
}
void init()
{
	for(int i=0;i<27;i++)
	{
		pre[i]=i;
	}
}
int main()  
{  
    int n, k, distance, number, ans;  
    char start, end;  
    while(cin >> n, n)  
    {  
    	memset(pre,0,sizeof(pre));
        ans = k = 0;  
        init();
        for(int i = 0; i < n- 1; i++)  
        {  
            cin >> start >> number;  
            for(int j = 0; j < number; j++)  
            {  
                cin >> end >> distance;  
                p[k].u = start - 'A';  
                p[k].v = end - 'A';  
                p[k++].distance = distance;  
            }  
        }  
        sort(p, p + k, cmp);  
        for(int i = 0; i < k; i++)  
        {  
            int x = find(p[i].u);  
            int y = find(p[i].v);  
  
            if(x != y)  
            {  
                ans = ans + p[i].distance;  
                pre[y] = x;  
            }  
        }  
        cout << ans << endl;  
    }  
    return 0;  
}  

J - Truck History

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define MAX 2000*2000
using namespace std;  
int pre[MAX];  
struct node1
{
	char str[100];
}a[2001];
struct node  
{  
    int u;  
    int v;  
    int distance;  
}p[MAX];  
bool cmp(node a, node b)  
{  
    return a.distance < b.distance;  
}  
int find(int x)
{
	if(pre[x]==x) return x;
	return pre[x]=find(pre[x]);
}
void init(int n)
{
	for(int i=0;i<n;i++)
	{
		pre[i]=i;
	}
}
int main()  
{  
    int n;
  //  getchar();
    while(scanf("%d",&n)!=EOF&&n!=0)
    {
    	getchar();
    	init(n);
    	for(int i=0;i<n;i++)
    	{
    		gets(a[i].str);
		}
		int k=0;
		for(int i=0;i<n-1;i++)
		{
			for(int j=i;j<n;j++)
			{
				int num=0;
				p[k].u=i;
				p[k].v=j;
				for(int s=0;s<7;s++)
				{
					if(a[i].str[s]!=a[j].str[s])
					{
						num++;
					}
				}
				p[k++].distance=num;
			}
		}
		sort(p,p+k,cmp);
		int ans=0;
		for(int i = 0; i < k; i++)  
        {  
            int x = find(p[i].u);  
            int y = find(p[i].v);  
            if(x != y)  
            {  
                ans = ans + p[i].distance;  
            //    printf("%d    !!!\n",p[i].distance);
                pre[y] = x;  
            }  
        }  
        printf("The highest possible quality is 1/%d.\n",ans);
	}
    return 0;  
}  

 

K - 最小生成树一·Prim算法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define line cout<<"-------------------------"<<endl;
#define clr(a) memset(a,0,sizeof(a))

const int MAXN = 1e6+10;
const int INF = 0x3f3f3f3f;
const int Mod = 1e9+7;
const int N = 1010;

int n,num;
ll ans ;
int mp[N][N],pre[MAXN];
struct node{
    int u,v;
    int cost;
}p[MAXN];

bool cmp (node a,node b){
    return a.cost < b.cost;
}
void init(){
    for(int i=0;i<=num;i++)
        pre[i] = i;
}
int find(int x){
    if(pre[x] ==  x) return x;
    return pre[x] = find(pre[x]);
}
int main(){
    while(scanf("%d",&n)!=EOF){
        num = 0;
        ans = 0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                scanf("%d",&mp[i][j]);
                if(i > j){
                    p[num].u = i;
                    p[num].v = j;
                    p[num++].cost = mp[i][j];
                }
            }
        }
        sort(p,p+num,cmp);
        init();
        for(int i=0;i<num;i++){
            int dx = find(p[i].u);
            int dy = find(p[i].v);
            if(dx != dy){
                pre[dy] = dx;
                ans += p[i].cost;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

L - 最小生成树二·Kruscal算法

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
#define clr(a) memset(a,0,sizeof(a))

const int maxn =  1e6+10;

int n,m,ans;
int pre[maxn];
struct node{
    int u,v;
    int cost;
}p[maxn];
void init(){
    for(int i=0;i<=n;i++)
        pre[i] = i;
}
int find(int x){
    if(x == pre[x]) return x;
    return pre[x] = find(pre[x]);
}
bool cmp(node a,node b){
    return a.cost < b.cost;
}
int main(){
    while(scanf("%d%d",&n,&m)!=EOF){
        clr(p);
        ans = 0;
        int u,v,cost;
        init();
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&u,&v,&cost);
            p[i].u = u;
            p[i].v = v;
            p[i].cost = cost;
        }
        sort(p,p+m,cmp);
        for(int i=0;i<m;i++){
            int dx = find(p[i].u);
            int dy = find(p[i].v);
            if(dx != dy){
                ans += p[i].cost;
                pre[dy] = dx;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值