Code Project
Code Project
/*#############################
MET-ASSISTANT
###############################*/
#include<iostream>
#include<bits/stdc++.h>
#include<windows.h>
#include<mysql.h>
#include<sstream>
#include<map>
#include<queue>
#include<string>
#include<graphics.h>
using namespace std;
class Graph_M
{
public:
class Vertex
{
public:
map<string,int> nbrs;
Vertex()
{
this->nbrs={};
}
};
map<string, Vertex> vtces;
Graph_M()
{
this->vtces = {};
}
int numVertex()
{
return vtces.size();
}
bool containsVertex(string vname)
{
if(vtces.find(vname)!=vtces.end())
return true;
else
return false;
}
void addVertex(string vname)
{
Vertex vtx; //= new Vertex();//doubt/
vtces.insert({vname, vtx});
}
void removeVertex(string vname)
{
Vertex &vtx = vtces[vname];
vector<string> keys ;
//
for (auto it = vtx.nbrs.begin(); it != vtx.nbrs .end();it++)
{
keys.push_back(it->first);
}
for (auto key : keys)
{
Vertex &nbrVtx = vtces[key];
nbrVtx.nbrs.erase(vname);
}
vtces.erase(vname);
}
int numEdges()//whole map
{
vector<string> keys;
for (auto it = vtces.begin(); it != vtces.end(); it++)
{
keys.push_back(it->first);
}
int count = 0;
return count / 2;
}
bool containsEdge(string vname1, string vname2)
{
Vertex vtx1 = vtces[vname1];
Vertex vtx2 = vtces[vname2];
if(vtces.find(vname1)==vtces.end() ||
vtces.find(vname2)==vtces.end() || vtx1.nbrs.find(vname2)==vtx1.nbrs.end())
{
return false;
}
return true;
}
void addEdge(string vname1, string vname2, int value)
{
Vertex &vtx1 = vtces[vname1];
Vertex &vtx2 = vtces[vname2];
if (vtces.find(vname1)==vtces.end() ||
vtces.find(vname2)==vtces.end() || vtx1.nbrs.find(vname2) != vtx1.nbrs.end()) {
return;
}
vtx1.nbrs.insert({vname2, value});
vtx2.nbrs.insert({vname1, value});
}
vtx1.nbrs.erase(vname2);
vtx2.nbrs.erase(vname1);
}
vector<string> returnkeys()
{
vector<string>keys;
for(auto i: vtces)
{
keys.push_back(i.first);
}
return keys;
}
void display_Map()
{
cout<<"\t------------------";
cout<<"------------------------------";
//MARK AS DONE
processed.insert({vname1, true});
cout<<endl;
Vertex vtx = vtces[vname1];
vector<string> keys;
for (auto it = vtx.nbrs.begin(); it != vtx.nbrs.end(); it++)
{
keys.push_back(it->first);
}
if (processed.find(keys[i])== processed.end())
{
if (hasPath(keys[i], vname2, processed))
{
return true;
}
}
}
return false;
}
struct pair
{
string vname;
string psf;
int min_dis;
int min_time;
};
stock.insert(stock.begin(),sp);
if (processed.find(rp.vname) != processed.end())
{
continue;
}
// processed put
processed.insert({rp.vname, true});
stock.insert(stock.begin(),np);
}
}
}
ans = ans + to_string(min);
return ans;
}
pair rp = stock[0];
stock.erase(stock.begin());
if (processed.find(rp.vname) != processed.end())
{
continue;
}
// processed put
processed.insert({rp.vname, true});
vector<string> printCodeList()
{
cout<<"List of station along with their codes:\n";
vector<string> keys;
for (auto it: vtces)
{
keys.push_back(it.first);
}
vector<string> codes;
for (string key: keys)
{
//string key =keys[3];
cout<<key<<endl;
vector<string> words;
string word = "";
for (int i=0;i<=key.size();i++)
{
if (key[i]==' '||key[i]=='\0')
{
words.push_back(word);
word="";
}
else
{
word=word+key[i];
}
}
if (words.size()==1)
{
string code = words[0].substr(0,2);
for (int i=0;i<code.size();i++)
{
if (code[i]>=97 && code[i]<=122)
{
code[i] = (code[i]-32);
}
}
codes.push_back(code);
//cout<<code<<endl;
}
else if (words.size()>=2)
{
string code;
for (int i=0;i<words.size();i++)
{
code += words[i].substr(0,1);
}
for (int i=0;i<code.size();i++)
{
if (code[i]>=97 && code[i]<=122)
{
code[i] = (code[i]-32);
}
}
codes.push_back(code);
//cout<<code<<endl;
}
}
int m=0;
for (int i=0;i<codes.size();i++)
{
cout<<i<<". "<<keys[i];
if (keys[i].size()<(22-m))
cout<<"\t";
if (keys[i].size()<(14-m))
cout<<"\t";
if (keys[i].size()<(6-m))
cout<<"\t";
cout<<codes[i]<<endl;
if (i==pow(10,m))
m++;
}
return codes;
}
class dijkstrapair
{
public:
string vname;
string psf;
int cost;
};
if(key == src)
{
np.cost = 0;
np.psf = key;
}
m.insert({key,np});
}
while(true)
{
int mi = INT_MAX;
dijkstrapair rp;
for(auto i :m)
{
if(i.second.cost<mi)
{
mi = i.second.cost;
rp = i.second;
}
}
if(rp.vname==des)
{
val = rp.cost;
break;
}
m.erase(rp.vname);
ans.push_back(rp.vname);
Vertex v = vtces[rp.vname];
Vertex k = vtces[rp.vname];
int nc;
nc = rp.cost + k.nbrs[nbr.first];
};
if(prev == next)
{
arr.push_back(res[i]);
}
else
{
}
}
else
{
arr.push_back(res[i]);
}
}
arr.push_back(to_string(count));
arr.push_back(res[res.size()-1]);
return arr;
MYSQL* con1;
MYSQL_ROW row1;
MYSQL_RES* res1;
con1 = mysql_init(0);
con1 = mysql_real_connect(con1,"localhost","root",NULL,"miniproject",0,NULL,0);
if(con1)
{
int qstate = mysql_query(con1, "SELECT station_one, station_two, weight
FROM route");
if(!qstate)
{
res1 = mysql_store_result(con1);
while(row1 = mysql_fetch_row(res1))
{
int x;
sscanf(row1[2], "%d", &x);
g->addEdge(row1[0],row1[1],x);
}
}
}
mysql_close(con1);
}
int main()
{
Graph_M g;
create_metro_map(&g);
initwindow(700,600,"Image Window");
readimagefile("map.jpg", 0,0,700,600);
while(true)
{
cout<<"\t\t\t\t~~LIST OF ACTIONS~~\n\n"<<endl;
cout<<"1. LIST ALL THE STATIONS IN THE MAP"<<endl;
cout<<"2. SHOW THE METRO MAP"<<endl;
cout<<"3. GET SHORTEST DISTANCE FROM A 'SOURCE' STATION TO
'DESTINATION' STATION"<<endl;
cout<<"4. GET SHORTEST TIME TO REACH FROM A 'SOURCE' STATION
TO 'DESTINATION' STATION"<<endl;
cout<<"5. GET SHORTEST PATH (DISTANCE WISE) TO REACH FROM A
'SOURCE' STATION TO 'DESTINATION' STATION"<<endl;
cout<<"6. GET SHORTEST PATH (TIME WISE) TO REACH FROM A
'SOURCE' STATION TO 'DESTINATION' STATION"<<endl;
cout<<"7. GET FARE FOR JOURNEY FROM 'SOURCE' STATION TO
'DESTINATION' STATION"<<endl;
cout<<"8. EXIT THE MENU"<<endl;
cout<<"\nENTER YOUR CHOICE FROM THE ABOVE LIST (1 to 7) : ";
int choice = -1;
cin>>choice;
cout<<"\n***********************************************************\n";
if(choice == 8)
{
exit(0);
}
switch(choice)
{
case 1:
g.display_Stations();
break;
case 2:
g.display_Map();
break;
case 3:
{
vector<string>keys = g.returnkeys();
vector<string> codes = g.printCodeList();
cout<<"\n1. TO ENTER SERIAL NO. OF STATIONS\n2. TO ENTER CODE
OF STATIONS\n3. TO ENTER NAME OF STATIONS\n"<<endl;
cout<<"ENTER YOUR CHOICE:"<<endl;
int ch;
cin>>ch;
int j;
}
else if(ch == 3)
{
cout<<"ENTER THE SOURCE STATION: "<<endl;
fflush(stdin);
getline(cin,st1);
cout<<"ENTER THE DESTINATION STATION: "<<endl;
fflush(stdin);
getline(cin,st2);
}
else
{
cout<<"INVALID CHOICE"<<endl;
exit(0);
}
map<string, bool>processed;
if(!g.containsVertex(st1) || !g.containsVertex(st2) || !g.hasPath(st1, st2,
processed))
{
cout<<"THE INPUTS ARE INVALID"<<endl;
}
else
{
cout<<"SHORTEST DISTANCE FROM "<<st1<<" TO "<<st2<<" IS
"<<g.dijkstra(st1, st2)<<"KM\n"<<endl;
}
break;
}
case 4:
{
string st1="",st2="";
cout<<"ENTER THE SOURCE STATION: "<<endl;
fflush(stdin);
getline(cin,st1);
cout<<"ENTER THE DESTINATION STATION: "<<endl;
fflush(stdin);
getline(cin,st2);
map<string, bool>processed;
if(!g.containsVertex(st1) || !g.containsVertex(st2) || !g.hasPath(st1, st2,
processed))
{
cout<<"THE INPUTS ARE INVALID"<<endl;
}
else
{
cout<<"SHORTEST TIME FROM "<<st1<<" TO "<<st2<<" IS
"<<((g.dijkstra(st1, st2)*60)/40)+" MINUTES\n\n"<<endl;
}
break;
}
case 5:
{
cout<<"ENTER THE SOURCE STATION: "<<endl;
fflush(stdin);
string s1;
getline(cin,s1);
cout<<"ENTER THE DESTINATION STATION: "<<endl;
fflush(stdin);
string s2;
getline(cin,s2);
case 6:
{
cout<<"ENTER THE SOURCE STATION: "<<endl;
fflush(stdin);
string ss1;
getline(cin,ss1);
cout<<"ENTER THE DESTINATION STATION: "<<endl;
fflush(stdin);
string ss2;
getline(cin,ss2);
case 7:
{
cout<<"ENTER THE SOURCE STATION: "<<endl;
fflush(stdin);
string ss1;
getline(cin,ss1);
cout<<"ENTER THE DESTINATION STATION: "<<endl;
fflush(stdin);
string ss2;
getline(cin,ss2);