#include <iostream>
#include <fstream>
#include <hash_map>
#include <string>
#include <stdlib.h>
#include <queue>
using namespace std;
using namespace stdext;
struct DisNode{
int node;
double cost;
DisNode *next;
};
struct OriNode{
int node;
int edgeNum;
DisNode *first;
};
double INFINIT = 99999999;
int NODE_NUM;
int main()
{
cout<<"test begin"<<endl;
const char* AListFile = "AdjacencyList.txt";
const char* LCostFile = "LinkCost.txt";
const int MIN = 800000000;
NODE_NUM = 0;
hash_map<int,double> LCostHash;
hash_map<int,OriNode*> NodeHash;
ifstream if_AList;
ifstream if_LCost;
if_AList.open(AListFile);
if_LCost.open(LCostFile);
if(if_AList.is_open()&&if_LCost.is_open())
{
cout<<"file is opened"<<endl;
int Lid = 0;
double cost = 0.000;
char line[30];
//save cost
while(!if_LCost.eof())
{
if_LCost.getline(line,30);
char* str = strstr(line,",");
// cout<<str<<endl;
int size = str - line;
char LidC[10];
strncpy(LidC,line,size);
LidC[size] = '/0';
char*CostC = str +1;
Lid = atoi(LidC);
cost = atof(CostC);
cout<<Lid<<" "<<cost<<endl;
LCostHash[Lid] = cost;
}
//save cost
cout<<"hashtable is saved"<<endl;
//save node info
while(!if_AList.eof())
{
NODE_NUM ++;
int node;
int edgeNum;
OriNode* orinode = (OriNode *)malloc(sizeof(OriNode));
if_AList>>node;
if_AList>>edgeNum;
orinode->node = node;
orinode->edgeNum = edgeNum;
DisNode *disnodeTemp = (DisNode *)malloc(sizeof(DisNode)) ;
int dis_node;
if_AList>>dis_node;
disnodeTemp->node = dis_node;
int cid;
if_AList>>cid;
disnodeTemp->cost = LCostHash[cid];
orinode->first = disnodeTemp;
cout <<orinode->node<<" "<<orinode->edgeNum<<" ";
for (int j = 1; j < orinode->edgeNum; j++)
{
DisNode *disnode = (DisNode *)malloc(sizeof(DisNode));
if_AList>>disnode->node;
cout <<disnode->node<<" ";
int cid;
if_AList>>cid;
disnode->cost = LCostHash[cid];
disnodeTemp->next = disnode;
disnodeTemp = disnode;
}
NodeHash[orinode->node] = orinode;
cout<<endl;
}
//save node info
//测试保存结果
cout<<LCostHash[2]<<endl;
cout<<((OriNode*)NodeHash[3])->node<<endl;
//测试保存结果
if_AList.close();
if_LCost.close();
}
//dijkstra
int oriID;
int desID;
cout<<"Please enter the original node id: ";
cin>>oriID;
cout<<endl;
cout<<"Please enter the destination node id: ";
cin>>desID;
cout<<endl;
cout<<"wait..."<<endl;
queue<int> QNode;
hash_map<int,double> QCostHash;
for (int n = 0; n < 1000; n++)
{
QCostHash[n] = INFINIT;
}
QCostHash[oriID] = 0;
QNode.push(oriID);
while(!QNode.empty())
{
int uNode = QNode.front();
QNode.pop();
if(uNode == desID)
{
break;
}
OriNode * uOriNode = (OriNode*)NodeHash[uNode];
DisNode* uDisNode = uOriNode->first;
for (int m = 0; m < uOriNode->edgeNum; m++)
{
int alt = QCostHash[uNode] + uDisNode->cost;
if(alt < QCostHash[uDisNode->node])
{
QCostHash[uDisNode->node] = alt;
}
QNode.push(uDisNode->node);
uDisNode = uDisNode->next;
}
}
cout<<"The result is :"<<QCostHash[desID]<<endl;
//dijkstra
int test;
cin>>test;
return 0;
}