#include <stdio.h> #include <stdlib.h> int adjmat[10][10]; struct banks { int netAmount; char name; char types[3]; }; struct Pair { int first; char second; }; int GetMinIndex(struct banks listOfAmounts[],int numBanks) { int min=INT_MAX,minIndex=-1; for(int i=0;i<numBanks;i++) { if(listOfAmounts[i].netAmount==0) continue; if(listOfAmounts[i].netAmount < min) { minIndex=i; min=listOfAmounts[i].netAmount; } } return minIndex; } int getSimpleMaxIndex(struct banks listOfNetAmounts[],int numBanks){ int max=INT_MIN, maxIndex=-1; for(int i=0;i<numBanks;i++){ if(listOfNetAmounts[i].netAmount == 0) continue; if(listOfNetAmounts[i].netAmount > max){ maxIndex = i; max = listOfNetAmounts[i].netAmount; } } return maxIndex; }/* struct Pair getMaxIndex(struct banks listOfNetAmounts[], int numBanks, int minIndex, struct banks input[], int maxNumTypes) { int max = INT_MIN; int maxIndex = -1; char matchingType[100]; for (int i = 0; i < numBanks; i++) { if (listOfNetAmounts[i].netAmount == 0) continue; if (listOfNetAmounts[i].netAmount < 0) continue; //TODO //see complexity of intersection char v[maxNumTypes][100]; char *ls = set_intersection((char *)listOfNetAmounts[minIndex].types, (char *)listOfNetAmounts[minIndex].types + listOfNetAmounts[minIndex].numTypes * 100, (char *)listOfNetAmounts[i].types, (char *)listOfNetAmounts[i].types + listOfNetAmounts[i].numTypes * 100, (char *)v); if ((ls - (char *)v) / 100 != 0 && max < listOfNetAmounts[i].netAmount) { max = listOfNetAmounts[i].netAmount; maxIndex = i; strcpy(matchingType, v[0]); } } //if there is NO such max which has a common type with any remaining banks then maxIndex has -1 // also return the common payment type struct pair result; result.first = maxIndex; strcpy(result.second, matchingType); return result; }*/ struct BankAndType { int bankIndex; char paymentType; }; struct BankAndType getMaxIndex(struct banks* listOfNetAmounts, int numBanks, int minIndex, struct banks* input, int maxNumTypes) { int max = INT_MIN; int maxIndex = -1; char matchingType = '\0'; for (int i = 0; i < numBanks; i++) { if (listOfNetAmounts[i].netAmount == 0 || listOfNetAmounts[i].netAmount < 0) { continue; } for (int j = 0; j < listOfNetAmounts[i].types; j++) { char currentType = listOfNetAmounts[i].types[j]; for (int k = 0; k < minIndex; k++) { if (listOfNetAmounts[k].netAmount == 0 || listOfNetAmounts[k].netAmount > 0) { continue; } for (int l = 0; l < listOfNetAmounts[k].types; l++) { if (currentType == listOfNetAmounts[k].types[l]) { if (listOfNetAmounts[i].netAmount > max) { max = listOfNetAmounts[i].netAmount; maxIndex = i; matchingType = currentType; } } } } } } struct BankAndType result = { maxIndex, matchingType }; return result; } void Minimizecashflow(int numBanks,struct banks input[6],char aindexOf[6],int numTras,int adjmat[6][6],int maxTypes) { struct banks listOfNetAmounts[numBanks]; for(int b=0;b<numBanks;b++) { listOfNetAmounts[b].name=input[b].name; for(int i=0;i<numBanks;i++) { listOfNetAmounts[b].types[i]=input[b].types[i]; } int amount=0; for(int i=0;i<numBanks;i++){ amount += (adjmat[i][b]); } for(int j=0;j<numBanks;j++){ amount += ((-1) * adjmat[b][j]); } listOfNetAmounts[b].netAmount = amount; } struct Pair ansGraph[numBanks][numBanks]; int numZeroNetAmounts=0; int maxIndex=0; for(int i=0;i<numBanks;i++){ if(listOfNetAmounts[i].netAmount == 0) numZeroNetAmounts++; } while(numZeroNetAmounts!=numBanks){ int minIndex=GetMinIndex(listOfNetAmounts, numBanks); struct Pair maxAns = getMaxIndex(listOfNetAmounts, numBanks, minIndex,input,maxTypes); int maxIndex = maxAns.first; if(maxIndex == -1){ (ansGraph[minIndex][0].first) += abs(listOfNetAmounts[minIndex].netAmount); //(ansGraph[minIndex][0].second) = *(input[minIndex].types.begin()); int simpleMaxIndex = getSimpleMaxIndex(listOfNetAmounts, numBanks); (ansGraph[0][simpleMaxIndex].first) += abs(listOfNetAmounts[minIndex].netAmount); // (ansGraph[0][simpleMaxIndex].second) = *(input[simpleMaxIndex].types.begin()); listOfNetAmounts[simpleMaxIndex].netAmount += listOfNetAmounts[minIndex].netAmount; listOfNetAmounts[minIndex].netAmount = 0; if(listOfNetAmounts[minIndex].netAmount == 0) numZeroNetAmounts++; if(listOfNetAmounts[simpleMaxIndex].netAmount == 0) numZeroNetAmounts++; } else{ int transactionAmount; if(listOfNetAmounts[minIndex].netAmount < listOfNetAmounts[maxIndex].netAmount) { transactionAmount=listOfNetAmounts[minIndex].netAmount; } else { transactionAmount=listOfNetAmounts[maxIndex].netAmount; } (ansGraph[minIndex][maxIndex].first) += (transactionAmount); // (ansGraph[minIndex][maxIndex].second) = maxAns.second; listOfNetAmounts[minIndex].netAmount += transactionAmount; listOfNetAmounts[maxIndex].netAmount -= transactionAmount; if(listOfNetAmounts[minIndex].netAmount == 0) numZeroNetAmounts++; if(listOfNetAmounts[maxIndex].netAmount == 0) numZeroNetAmounts++; } } // printAns(ansGraph,numBanks,input); } int main() { printf("\n---------------------------------------------------------------------------------------Welcome to CASH FLOW MINIMIZER SYSTEM--------------------------------------------------------------------------------------\n\n\n"); int numBanks; printf("\nEnter The Number Of Banks:"); scanf("%d",&numBanks); printf("\n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n\n"); struct banks input[numBanks]; char aindexOf[numBanks]; int maxTypes; printf("Enter The Details Of The Banks and Transactions As Stated:\n"); printf("Bank Name , Number Of Payment Modes It has and the Payment Modes.\n"); printf("\n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n\n"); for(int i=0;i<numBanks;i++) { if(i==0) printf("WorldBank:"); else{ printf("Bank: %d ",i); } fflush(stdin); printf("\nEnter name of bank:"); fflush(stdin); scanf("%c",&input[i].name); aindexOf[i]=input[i].name; fflush(stdin); printf("\nEnter Number Of Modes: "); int numTypes; scanf("%d",&numTypes); printf("\nClick \nPhone pay-1, \nPaytm-2, \nGoogle pay-3::"); if(i==0) maxTypes=numTypes; int inputTypesofpayment; input[i].types[0]=0;//gpay input[i].types[1]=0;//paytm input[i].types[2]=0;//phonepe while(numTypes--) { scanf("%d",&inputTypesofpayment); input[i].types[inputTypesofpayment]=1; } printf("\n----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n\n"); } printf("\nEnter number of Trasaction."); int NumTras; scanf("%d",&NumTras); int adjmat[numBanks][numBanks]; for(int i=0;i<numBanks;i++) { for(int j=0;j<numBanks;j++){ adjmat[i][j]=0; } } printf("Debtor Bank , creditor Bank and amount\n"); for(int i=0;i<NumTras;i++) { printf("\n%d: th trasaction:",i+1); fflush(stdin); char fBank,sBank; int amount; fflush(stdin); scanf("%c %c",&fBank,&sBank); fflush(stdin); scanf("%d",&amount); fflush(stdin); int retindf=0; int retinds=0; for(int i=0;i<numBanks;i++) { //printf("\nI am in"); if(aindexOf[i]==fBank) retindf=i; if(aindexOf[i]==sBank) retinds=i; } adjmat[retindf][retinds]=amount; } /*for(int i=0;i<numBanks;i++) { for(int j=0;j<numBanks;j++){ printf("%d ",adjmat[i][j]); } printf("\n"); }*/ Minimizecashflow(numBanks,input,aindexOf,NumTras,adjmat,3); return 0; }
Preview:
downloadDownload PNG
downloadDownload JPEG
downloadDownload SVG
Tip: You can change the style, width & colours of the snippet with the inspect tool before clicking Download!
Click to optimize width for Twitter