Thursday, February 19, 2009

enumerate all cycles in a graph c++ code

Finding all cycles in an undirected graph is an interesting problem. Few days ago, I tried to count all the cycles in a K6, a complete graph with 6 vertices. Finding the 7 cycles from a K4 is easy. But finding the 197 cycles in a K6 is not that trivial. Then I wrote a c++ code to enumerate all cycles in a graph. I tested it on some connected graphs and the results seem correct. Here are the results for the complete graphs, which I can verify by (sum_{k=3}^{n}{1/2 * nCr(n,k)*(k-1)!}.
Number of vertices, number of cycles
3, 1
4,7
5,37
6,197
7,1172
8,8018
9,62814
10,556014
11,5,488,059
20,174548332364311563

Here is the code: graph.txt allcycles.cpp

Wednesday, February 18, 2009

C++ STL SET example: How to insert objects (ADT) into the set

If your set elements are ADTs or class objects, the elements must be comparable to be inserted into SET container. There is an example. Set example

Tuesday, February 10, 2009

ACM Programming Contest Problem: Alpha code
Alice and Bob need to send secret messages to each other and are discussing ways to encode their messages:
Alice: “Let’s just use a very simple code: We’ll assign ‘A’ the code word 1, ‘B’ will be 2,
and so on down to ‘Z’ being assigned 26.”
Bob: “That’s a stupid code, Alice. Suppose I send you the word ‘BEAN’ encoded as 25114.
You could decode that in many different ways!”
Alice: “Sure you could, but what words would you get? Other than ‘BEAN’, you’d get
‘BEAAD’, ‘YAAD’, ‘YAN’, ‘YKD’ and ‘BEKD’. I think you would be able to figure out the
correct decoding. And why would you send me the word ‘BEAN’ anyway?”
Bob: “OK, maybe that’s a bad example, but I bet you that if you got a string of length 500
there would be tons of different decodings and with that many you would find at least two
different ones that would make sense.”
Alice: “How many different decodings?”
Bob: “Jillions!”

For some reason, Alice is still unconvinced by Bob’s argument, so she requires a program that will
determine how many decodings there can be for a given string using her code.
Input
Input will consist of multiple input sets. Each set will consist of a single line of digits representing a
valid encryption (for example, no line will begin with a 0). There will be no spaces between the digits.
An input line of ‘0’ will terminate the input and should not be processed
Output
For each input set, output the number of possible decodings for the input string. All answers will be
within the range of a long variable.
Sample Input
25114
1111111111
3333333333
0
Sample Output
6
89
1

Solution:

When a new digit A is added to the existing digits BCDE, there are 3 cases:
1. If AB can't combine (AB > 26), the number of decodings is same.
2. If AB can combine, but BC can't combine, the number of decodings double.
3. If AB and BC both can combine, then the number of decodings is equal to the sum of previous two decodings.

You notice that, if all the numbers can combine with neighbours, then the number of decodings is Fibonacci number.

Here is the C++ code.


//============================================================================
// Name : ACM_Alpha_Code.cpp
// Author : Anwar Mamat
//============================================================================

#include
#include
using namespace std;

int main() {

ifstream fin("data.txt");
string strCode;
int i = 0;
int codeLength = 0;
int firstDigit = 0;
int secondDigit = 0;
int sum[100]={1};
int currentDigit = 0;

while(fin >> strCode){ //read number of data set
if(strCode == "0") break;
cout << "Code:" << codelength =" strCode.length();" i =" 1;" currentdigit =" strCode.at(codeLength"> 26 ){//if the new digit can't combine with the first digit
sum[i] = sum[i-1]; //the number of decodings are same
}
else if(firstDigit * 10 + secondDigit > 26) //if first digit can't combine with second digit
sum[i] = sum[i-1] * 2; //number of decodings doubles
else{
if(i == 1)
sum[i] = 1;
else
sum[i] = sum[i-1] + sum [i - 2]; //if new digit, fist digit and second digits can combine,
} //number of decodings is Fibonacci number.
secondDigit = firstDigit;
firstDigit = currentDigit;
}
//for(i = codeLength ; i > 0 ; i--)
// cout <<"Sum[" << i << "]=" << sum[i] << endl;

cout <<"Sum=" << sum[codeLength] << endl;
}
fin.close();
return 0;
}



The data.txt file:
25114
1111111111
33333333333333333
0