#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