Well Project

 avatar
unknown
plain_text
a year ago
2.6 kB
7
Indexable
#define _CRT_SECURE_NO_WARNINGS
#define SIZE 109

#include<iostream>

using namespace std;

int visit[SIZE];
int A[SIZE][SIZE];
int countdown;
int Answer;
int i, j;
int mini;
int jmini;

int main(int argc, char** argv) {
	int test_case;
	int T, N;

	//ios::sync_with_stdio(false);

	freopen("Well Project.txt", "r", stdin);
	cin >> T;

	for (test_case = 1; test_case <= T; ++test_case) {
		Answer = 0;

		cin >> N;
		for (i = 1; i <= N; i++) {
			for (j = 1; j <= N; j++) {
				cin >> A[i][j];
			}
			visit[i] = 0;
		}

		// PRIM
		// Add 1st vertex to MST
		visit[1] = 1;
		countdown = 1;
		//Add one by one vertex to MST
		while (countdown < N) {
			//Find the minimum weight vertex
			mini = 1000000;
			for (i = 1; i <= N; i++) {
				if (visit[i] == 1) {
					for (j = 1; j <= N; j++) {
						if (j != i && !visit[j]) {
							if (A[i][j] < mini) {
								mini = A[i][j];
								jmini = j;
							}
						}
					}
				}
			}
			//Add found vertex
			visit[jmini] = 1;
			Answer += mini;
			countdown++;
		}


		// Print the answer to standard output(screen).
		cout << "Case #" << test_case << endl << Answer << endl;
	}
	//while(1);
	return 0;//Your program should return 0 on normal termination.
}















#include<iostream>
using namespace std;
#define N 101
int T, n, a[N][N];
int st[N*N];
int en[N*N];
int dist[N*N];
int parent[N];
int edge;

int findSet(int x)
{
	if(x==parent[x]) return x;
	return parent[x]=findSet(parent[x]);
}

void swap(int i, int j)
{
	int tmp=st[i]; st[i]=st[j]; st[j]=tmp;
	 tmp=en[i]; en[i]=en[j]; en[j]=tmp;
	 tmp=dist[i]; dist[i]=dist[j]; dist[j]=tmp;
}

void sort()
{
	for(int i=0;i<edge-1;i++)
		for(int j=i+1;j<edge;j++)
			if(dist[i]>dist[j])
				swap(i,j);
}

void makeSet(int x)
{
	parent[x]=x;
}

void join(int x, int y)
{
	parent[findSet(y)] = findSet(x);
}

int main()
{
	freopen("a.txt","r",stdin);
	cin>>T;
	for(int tc=1;tc<=T;tc++)
	{
		cin>>n;
		edge=0;
		for(int i=0;i<n;i++)
		{
			//parent[i]=i;
			makeSet(i);
			for(int j=0;j<n;j++)
			{
				cin>>a[i][j];
			}
		}

		for(int i=0;i<n;i++)
		{
			for(int j=i+1;j<n;j++)
			{
				
					dist[edge]=a[i][j];
					st[edge]=i;
					en[edge++]=j;
				
			}
		}
		int ans=0;
		sort();
		for(int i=0;i<edge;i++)
		{
			int u=findSet(st[i]);
			int v=findSet(en[i]);
			if(u==v)
				continue;
			else
			{
				ans+=dist[i];
				join(u,v);
			}
		}

		cout<<"Case #"<<tc<<endl<<ans<<endl;

	}
	return 0;
}
Editor is loading...
Leave a Comment