-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmpi.c
More file actions
73 lines (62 loc) · 1.23 KB
/
mpi.c
File metadata and controls
73 lines (62 loc) · 1.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "mpi.h"
int isGolomb(int x[],int in){
int map[100];
for(int i=0;i<100;i++) map[i] = 0;
for(int i=0;i<in;i++){
for(int j=i+1;j<in;j++){
int diff = x[j]-x[i];
if(map[diff]==1) return 0;
map[diff]=1;
}
}
return 1;
}
int recurse(int n,int k,int x[],int in){
int isg = isGolomb(x,in);
if(!isg) return 0;
if(in==n && isg){
for(int i=0;i<n;i++)
printf("%d ",x[i]);
printf("\n");
MPI_Abort(MPI_COMM_WORLD,911);
return 1;
}
x[in]=x[in-1]+1;
while(x[in]<=k-n+in){
int res = recurse(n,k,x,in+1);
if(res==1) return 1;
x[in]++;
}
return 0;
}
int main(int argc, char *argv[]){
int s,r;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&s);
MPI_Comm_rank(MPI_COMM_WORLD,&r);
int n,res=1000,tn=1000;
int x[30];
if(r==0){
scanf("%d",&n);
}
MPI_Bcast(&n,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
int k = (n*(n-1))/2;
int k2 = (int)((double)(n*n)-2*n*pow(n,0.5)+pow(n,0.5)-2);
if(k2>k) k = k2;
x[0] = 0;
if(r>=k){
x[n-1] = r;
if(recurse(n,r,x,1)){
res = r;
}
}
MPI_Barrier(MPI_COMM_WORLD);
MPI_Reduce(&res,&tn,1,MPI_INT,MPI_MIN,0,MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
MPI_Finalize();
return 0;
}