Guest User

Untitled

a guest
Jan 12th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.74 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "graph.h"
  5. #include "vc.h"
  6.  
  7. /*
  8. PROGRAMMA CHE RISOLVE L'IHITTING SET PROBLEM
  9. INPUT: A = { a1... an}
  10. e m diversi sottinsiemi B1...Bm sotinsiemi di A
  11. e intero K>=0
  12. OUTPUT:un insieme tale che HittingSet intersecato Bi per ogni i è diverso dal vuoto.
  13.  
  14. */
  15. /*
  16. return a empty HS
  17. */
  18. char *makeHS(int nov)
  19. {
  20.  
  21. char *vc;
  22. vc=(char *)malloc(nov+1); vc[nov]=0;
  23. memset(vc,'0',nov);
  24. return vc;
  25. }
  26. void stampaInsiemeA(int A[],int n)
  27. {
  28. int i;
  29. printf("\n\n====INSIEME A===\n");
  30. for(i=0;i<n;i++)
  31. {
  32. printf("%d\n",A[i]);
  33. }
  34. }
  35.  
  36. void stampaInsiemiB(int B[][100],int m)
  37. {
  38. int elem=0,i;
  39. printf("\n\n======INSIEMI B======\n\n");
  40.  
  41. for(i=0;i<m;i++)
  42. {
  43. printf("====INSIEME B-%d====\n",i);
  44. while(B[i][elem]!=-1)
  45. {
  46. printf("%d ",B[i][elem]);
  47. elem++;
  48. }
  49. printf("\n");
  50. elem=0;
  51. }
  52. }
  53. int cardinalita(int B[][100],int i)
  54. {
  55. int elem=0;
  56. int cardinalita=0;
  57. while(B[i][elem]!=-1)
  58. {
  59. cardinalita++;
  60. elem++;
  61. }
  62. return cardinalita;
  63.  
  64. }
  65.  
  66. void cancellaA(int A[],int i,int n)
  67. {
  68.  
  69. if(i<n)
  70. {
  71. A[i]=A[i+1];
  72. }
  73.  
  74.  
  75. }
  76.  
  77.  
  78. int cancellaB(int B[][100],int i,int m)
  79. {
  80.  
  81. int elem=0,ind=0;
  82. int j,t=0;
  83. int vet[100];
  84. int numB=m-1;
  85. int C[100][100];
  86. //cerco i Bi che hanno i e li salvo in vet[]
  87. for(j=0;j<m;j++)
  88. {
  89. while(B[j][elem]!=-1)
  90. {
  91. if(B[j][elem]==i)
  92. {
  93. vet[t]=j;
  94. t++;
  95. break;
  96. }
  97. elem++;
  98. }
  99. elem=0;
  100. }
  101. //copio la matrice B nella matrice C
  102. for(j=0;j<m;j++)
  103. {
  104. while(B[j][elem]!=-1)
  105. {
  106. C[j][elem]=B[j][elem];
  107. elem++;
  108. }
  109. C[j][elem]=-1;
  110. elem=0;
  111. }
  112.  
  113. //dove ho trovato l'elemento i pongo tutto il Bi a -2
  114.  
  115.  
  116. for(j=0;j<t;j++)
  117. {ind =vet[j];
  118. while(B[ind][elem]!=-1)
  119. {
  120. B[ind][elem]=-2;
  121. elem++;
  122.  
  123. }
  124. B[ind][elem]=-1;
  125. elem=0;
  126.  
  127. }
  128.  
  129.  
  130. elem=0;
  131. ind=0;
  132. int controllo=0;
  133. //copio nella matrice di appoggio solo i Bi che non contengono i
  134. for(j=0;j<m;j++)
  135. {
  136. while (B[j][elem]!=-1)
  137. {
  138. if(B[j][elem]!=-2)
  139. {
  140. C[ind][elem]=B[j][elem];
  141.  
  142. //printf("copio nella matrice d'appoggio C[%d][%d] : B[%d][%d]:%d\n",ind,elem,j,elem,C[ind][elem]);
  143. controllo++;
  144. }
  145.  
  146. elem++;
  147. }
  148. if(controllo!=0)
  149. {
  150. ind++;
  151. }
  152. controllo=0;
  153. C[ind][elem]=-1;
  154. elem=0;
  155.  
  156. }
  157. //ricopio tutto nella matrice B
  158. for(j=0;j<m-t;j++)
  159. {
  160. while (C[j][elem]!=-1)
  161. {
  162. B[j][elem]=C[j][elem];
  163. elem++;
  164. }
  165. B[j][elem]=-1;
  166. elem=0;
  167. }
  168.  
  169. printf("numero elementi rimanenti:%d\n",m-t);
  170. //stampaInsiemiB(B,m-t);
  171. return m-t;
  172.  
  173.  
  174.  
  175. }
  176. /*int coeffBinomiale(int n,int k)
  177. {
  178. int i,j,numeratore=n,denominatore=k;
  179. int coeff=0;
  180. for(i=n-1;i>=(n-k);i--)
  181. {
  182. numeratore=numeratore*i;
  183. }
  184. for(i=k;i>0;i--)
  185. {
  186. denominatore=denominatore*i;
  187. }
  188.  
  189. coeff=numeratore/denominatore;
  190. return coeff;
  191.  
  192. }
  193. */
  194. char *HS(int A[],int B[][100],int n,int m,int ini,int k,int D[][100],int vm)
  195. {
  196. int i=0,j,t=0,elem=0,w=0;
  197.  
  198. if((m==0)&&(k==0))
  199. { printf("stampa11\n");
  200.  
  201. char *c=NULL;
  202. return c;
  203. }
  204. if((m==0)&&(k!=0))
  205. { printf("stampa12\n");
  206. return makeHS(ini);
  207. }
  208. if((k==0)&&(m!=0))
  209. { printf("stampa2\n");
  210. char *c=NULL;
  211. return c;
  212. }
  213.  
  214.  
  215.  
  216. int vet[100];
  217.  
  218. while(B[i][elem]!=-1)
  219. {
  220. vet[t]=B[i][elem];
  221. printf("B[%d][%d]:%d\n",i,elem,vet[t]);
  222. elem++;
  223. t++;
  224.  
  225. }
  226.  
  227.  
  228. elem=0;
  229. char *r;
  230. for(i=0;i<t;i++)
  231. {int num=vet[i];
  232.  
  233. w=cancellaB(B,num,m);
  234. printf("cancella :%d\n",vet[i]);
  235. r=HS(A,B,n,w,ini,k-1,D,vm);
  236. if(r!=NULL)
  237. { printf("stampa3 %d\n",num);
  238. r[num]='1';
  239.  
  240.  
  241. }
  242. if(r==NULL)
  243. {
  244. *r=NULL;
  245. printf("stampa no HS\n");
  246.  
  247. }
  248. elem=0;
  249.  
  250. for(j=0;j<vm;j++)
  251. {
  252. while (D[j][elem]!=-1)
  253. { printf("lolo1 B[%d][%d]=D[%d][%d] :=%d = %d\n",j,elem,j,elem,B[j][elem],D[j][elem]);
  254. B[j][elem]=D[j][elem];
  255. printf("lolo2\n");
  256. elem++;
  257. }
  258. B[j][elem]=-1;
  259. elem=0;
  260. }
  261.  
  262.  
  263. }
  264. return r;
  265.  
  266.  
  267.  
  268. }
  269.  
  270.  
  271. int main (void)
  272. {
  273.  
  274. int n,m,i,j,k;
  275. int elem=0;
  276. int A[100];
  277. int B[100][100];
  278. printf("======HITTING SET PROBLEM======\n\n");
  279. printf("inserisci il numero di elementi nell'insieme A\n");
  280. scanf("%d",&n);
  281. printf("inserisci il numero di sottoinsiemi di A\n");
  282. scanf("%d",&m);
  283. printf("inserisci k\n");
  284. scanf("%d",&k);
  285.  
  286. for(i=0;i<n;i++)
  287. {
  288. printf("inserisci l'elemento %d-esimo dell'insieme A\n",i);
  289. scanf("%d",&A[i]);
  290. }
  291. printf("\n\n");
  292. for(i=0;i<m;i++)
  293. {
  294. printf("Quanti elementi contiene l'insieme B%d-esimo?\n",i);
  295. scanf("%d",&elem);
  296.  
  297. for(j=0;j<elem;j++)
  298. {
  299. printf("inserisci l'elemento nell'insieme \n");
  300. scanf("%d",&B[i][j]);
  301. }
  302. B[i][elem]=-1;
  303.  
  304. }
  305. int D[100][100];
  306.  
  307. stampaInsiemeA(A,n);
  308. stampaInsiemiB(B,m);
  309. elem=0;
  310. for(j=0;j<m;j++)
  311. {
  312. while (B[j][elem]!=-1)
  313. {
  314. D[j][elem]=B[j][elem];
  315. elem++;
  316. }
  317. elem=0;
  318. }
  319.  
  320.  
  321. char *s=HS( A,B,n,m,n,k,D,m);
  322. if(s!=NULL)
  323. {
  324. printf("esiste HS di cardinalita %d ed e':%s\n",k,s);
  325. }
  326. else
  327. {
  328. printf("non esiste HS di cardinalita %d\n",k);
  329. }
  330. system("pause");
  331. return 0;
  332. }
Add Comment
Please, Sign In to add comment