地铁行业代码查询系统统c语言代码怎么写

最短路径—Dijkstra算法和Floyd算法 - as_ - 博客园
随笔 - 150, 文章 - 0, 评论 - 170, 引用 - 0
注意:以下代码 只是描述思路,没有测试过!!
Dijkstra算法
1.定义概览
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。注意该算法要求图中不存在负权边。
问题描述:在无向图 G=(V,E) 中,假设每条边 E[i] 的长度为 w[i],找到由顶点 V0 到其余各点的最短路径。(单源最短路径)
2.算法描述
1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
2)算法步骤:
a.初始时,S只包含源点,即S={v},v的距离为0。U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则&u,v&正常有权值,若u不是v的出边邻接点,则&u,v&权值为&。
b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。
d.重复步骤b和c直到所有顶点都包含在S中。
执行动画过程如下图
3.算法代码实现:
MAXINT = 32767;
const int MAXNUM = 10;
int dist[MAXNUM];
int prev[MAXNUM];
int A[MAXUNM][MAXNUM];
void Dijkstra(int v0)
  bool S[MAXNUM];
// 判断是否已存入该点到S集合中
int n=MAXNUM;
  for(int i=1; i&=n; ++i)
  dist[i] = A[v0][i];
  S[i] = false;
// 初始都未用过该点
  if(dist[i] == MAXINT)
  prev[i] = -1;
  prev[i] = v0;
  dist[v0] = 0;
  S[v0] = true;   
   for(int i=2; i&=n; i++)
  int mindist = MAXINT;
  int u = v0;   
// 找出当前未使用的点j的dist[j]最小值
   for(int j=1; j&=n; ++j)
if((!S[j]) && dist[j]&mindist)
// u保存当前邻接点中距离最小的点的号码
mindist = dist[j];
  S[u] = true;
  for(int j=1; j&=n; j++)
if((!S[j]) && A[u][j]&MAXINT)
 if(dist[u] + A[u][j] & dist[j])
//在通过新加入的u点路径找到离v0点更短的路径
  dist[j] = dist[u] + A[u][j];
//更新dist
  prev[j] =
//记录前驱顶点
4.算法实例
先给出一个无向图
用Dijkstra算法找出以A为起点的单源最短路径步骤如下
1.定义概览
Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3),空间复杂度为O(N2)。
2.算法描述
1)算法思想原理:
&&&& Floyd算法是一个经典的动态规划算法。用通俗的语言来描述的话,首先我们的目标是寻找从点i到点j的最短路径。从动态规划的角度看问题,我们需要为这个目标重新做一个诠释(这个诠释正是动态规划最富创造力的精华所在)
&&&&& 从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设Dis(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查Dis(i,k) + Dis(k,j) & Dis(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置Dis(i,j) = Dis(i,k) + Dis(k,j),这样一来,当我们遍历完所有节点k,Dis(i,j)中记录的便是i到j的最短路径的距离。
2).算法描述:
a.从任意一条单边路径开始。所有两点之间的距离是边的权,如果两点之间没有边相连,则权为无穷大。   
b.对于每一对顶点 u 和 v,看看是否存在一个顶点 w 使得从 u 到 w 再到 v 比己知的路径更短。如果是更新它。
3).Floyd算法过程矩阵的计算----十字交叉法
方法:两条线,从左上角开始计算一直到右下角 如下所示
给出矩阵,其中矩阵A是邻接矩阵,而矩阵Path记录u,v两点之间最短路径所必须经过的点
相应计算方法如下:
最后A3即为所求结果
3.算法代码实现
typedef struct
char vertex[VertexNum];
int edges[VertexNum][VertexNum];
//邻接矩阵,可看做边表
//图中当前的顶点数和边数
void Floyd(MGraph g)
  int A[MAXV][MAXV];
  int path[MAXV][MAXV];
  int i,j,k,n=g.n;
  for(i=0;i&n;i++)
  for(j=0;j&n;j++)
  {   
A[i][j]=g.edges[i][j];
   path[i][j]=-1;
  for(k=0;k&n;k++)
  for(i=0;i&n;i++)
  for(j=0;j&n;j++)
  if(A[i][j]&(A[i][k]+A[k][j]))
  A[i][j]=A[i][k]+A[k][j];
  path[i][j]=k;
算法时间复杂度:O(n3)地铁收费系统C语言2
#define MAX_CARD_NUMBERS (10)
#define MAX_LOG_ITEMS (10)
#define FILENAME ("SubwayCharge.txt")
void opDestroyCardProc(int iCardNo);
//计算基本票价
int ComputeBasePrice(int distance);
//计算同站进出的情况
int GetSameStationChargePrice(TravelInfo_ST*
pstTravelInfo);
//计算扣费票价
int ComputeChargePrice(int baseprice, TravelInfo_ST*
pstTravelInfo);
//扣费过程
int ChargeProcess(int nChargePrice, TravelInfo_ST*
pstTravelInfo);
//将扣费记录添加到链表尾函数
int AddHistoryItemOnListTail(int nChargePrice, TravelInfo_ST*
pstTravelInfo );
//结构体交换
void Swap(LogItem_ST &logItemA, LogItem_ST
&logItemB);
//利用冒泡排序对卡号进行排序
void SortByCardID(LogItem_ST logItems[], int nItems);
//出站时间是否大于等于查询起始时间小于等于查询结束时间
int IsCheckTimeValid(QueryCond_ST* pstQueryCond, LogItem_ST
*logAddr);
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "api.h"
#include "SubwayCharge.h"
#include "SubwayList.h"
HistoryInfoNode *g_historyInfoNodeHead =
CardStat_EN g_CardStatusInfo[MAX_CARD_NUMBERS] =
{CARD_VALID};
void main(int argc, char* argv[])
& & apiServerStart(argc,
void opResetProc(void)
int i = 0;
if(NULL != g_historyInfoNodeHead)
if(RET_OK != RemoveList(g_historyInfoNodeHead))
g_historyInfoNodeHead = NULL;
g_historyInfoNodeHead = CreateList(); //创建链表头指针
if(NULL == g_historyInfoNodeHead)
FILE *fp = NULL;
fp = fopen(FILENAME, "wa ");&
if(NULL == fp)
apiPrintErrInfo(E99);
fclose(fp);
for(i = 0; i & MAX_CARD_NUMBERS; i )
g_CardStatusInfo = CARD_VALID;
//卡号为0-9的可用
void opChargeProc(TravelInfo_ST* pstTravelInfo)
//首先判断卡是否可用
if(CARD_UNVAILD ==
g_CardStatusInfo[pstTravelInfo-&nCardNo])
apiPrintErrInfo(E22);
//判断出站时间是否大于等于入站时间
if(apiTimeDiff(pstTravelInfo-&nInHour,pstTravelInfo-&nInMinute,pstTravelInfo-&nOutHour,pstTravelInfo-&nOutMinute)
apiPrintErrInfo(E02);
apiWriteLog(0, pstTravelInfo, RET_ERROR);
int nDistance = 0;
int flag = 0;
//计算两个站点之间的距离
apiGetDistanceBetweenTwoStation(pstTravelInfo-&sInStation
,pstTravelInfo-&sOutStation,
&nDistance);
if(RET_ERROR == flag)
apiPrintOpStatusInfo(I10,pstTravelInfo-&nCardNo,
pstTravelInfo-&nCardMoney);
apiWriteLog(0, pstTravelInfo, RET_ERROR);
//计算基本票价
int nBasePrice = ComputeBasePrice(nDistance);
//计算扣费票价
int nChargePrice =
ComputeChargePrice(nBasePrice,pstTravelInfo);
//进行扣费,并将扣费记录写入链表尾
ChargeProcess(nChargePrice, pstTravelInfo);
void opQueryLogProc(QueryCond_ST* pstQueryCond)
if(NULL == pstQueryCond)
apiPrintErrInfo(E99);
int nTimeDiff =
apiTimeDiff(pstQueryCond-&nStartHour,pstQueryCond-&nStartMinute,pstQueryCond-&nEndHour,pstQueryCond-&nEndMinute);
//出站时间是否大于等于进站时间
if(nTimeDiff & 0)
apiPrintErrInfo(E02);
LogItem_ST tmpLogItem[MAX_LOG_ITEMS];
memset(tmpLogItem, 0, sizeof(LogItem_ST) *
MAX_LOG_ITEMS);
int i = 0, j = 0;
int nLogItemCnt = 0; //记录条目数
LogItem_ST *pLogAddr = apiGetLogAddr();
int nItems = apiGetLogNum();
if(0 == pstQueryCond-&nCardNo)
for(i = 1; i & MAX_CARD_NUMBERS; i )
if(CARD_UNVAILD == g_CardStatusInfo)
for(j = 0; j & nI j )
if((pstQueryCond-&nCardNo ==
pLogAddr.nCardNo)
&& (RET_OK ==
IsCheckTimeValid(pstQueryCond,pLogAddr j)))
memcpy(&(tmpLogItem[nLogItemCnt]),&(pLogAddr),sizeof(LogItem_ST));
//卡号不为0
//判断卡是否有效
if(CARD_UNVAILD ==
g_CardStatusInfo[pstQueryCond-&nCardNo])
apiPrintErrInfo(E22); &
for(j = 0; j & nI j )
if((pstQueryCond-&nCardNo ==
pLogAddr.nCardNo)
&& (RET_OK ==
IsCheckTimeValid(pstQueryCond,pLogAddr j)))
memcpy(&(tmpLogItem[nLogItemCnt]),
&(pLogAddr),
sizeof(LogItem_ST));
if(nLogItemCnt &= 0)
apiPrintErrInfo(E21);
SortByCardID(tmpLogItem, nLogItemCnt);
apiPrintLog(tmpLogItem, nLogItemCnt);
void opQueryHistoryChargeListProc(int iCardNo)
void opDestroyCardProc(int iCardNo)
//计算基本票价
int ComputeBasePrice(int distance)
if (0 &= distance) &
return 0;&
else if ((0 & distance)
&& (3 &= distance))
return 2;&
else if ((3 & distance)
&& (5 &= distance))
return 3;&
else if ((5 & distance)
distance))
return 4;&
//计算同站进出的情况
int GetSameStationChargePrice(TravelInfo_ST*
pstTravelInfo)
//if(NULL == pstTravelInfo)
int nMoney = pstTravelInfo-&nCardM
& //卡金额
CardType_EN nCardType=
pstTravelInfo-&enCardT
int nTimeDiff =
apiTimeDiff(pstTravelInfo-&nOutHour,
pstTravelInfo-&nOutMinute,
pstTravelInfo-&nInHour,
pstTravelInfo-&nInMinute);
if(nTimeDiff &= 30)
if(CARDTYPE_A == nCardType) &//单程票
if(CARDTYPE_A == nCardType) &//单程票
return (nMoney&3 ? nMoney:3);
//return 0;
//计算扣费票价
int ComputeChargePrice(int baseprice, TravelInfo_ST*
pstTravelInfo)
//同站进出
if(0 == strcmp(pstTravelInfo-&sInStation,
pstTravelInfo-&sOutStation))
return GetSameStationChargePrice(pstTravelInfo);
//非同站进出
//票卡为单程票
if(CARDTYPE_A ==
pstTravelInfo-&enCardType)
return (pstTravelInfo-&nCardMoney
& baseprice) ?
pstTravelInfo-&nCardMoney :
//票卡为非单程票
int nInHour = pstTravelInfo-&nInH
int nInMin = pstTravelInfo-&nInM
int nCmpWith07_00 = apiTimeDiff(nInHour, nInMin, 7, 0);
int nCmpWith09_00 = apiTimeDiff(nInHour, nInMin, 9, 0);
int nCmpWith16_30 = apiTimeDiff(nInHour, nInMin, 16, 30);
int nCmpWith18_30 = apiTimeDiff(nInHour, nInMin, 18, 30);
if (((0 &= nCmpWith07_00)
nCmpWith09_00)) || ((0 &= nCmpWith16_30)
nCmpWith18_30)))//处于非优惠时段
int nCmpWith10_00 = apiTimeDiff(nInHour, nInMin, 10, 0);
int nCmpWith11_00 = apiTimeDiff(nInHour, nInMin, 11, 0);
int nCmpWith15_00 = apiTimeDiff(nInHour, nInMin, 15, 0);
int nCmpWith16_00 = apiTimeDiff(nInHour, nInMin, 16, 0);
if (((0 &= nCmpWith10_00)
nCmpWith11_00))|| ((0 &= nCmpWith15_00)
nCmpWith16_00))) & // 处于优惠时段
return baseprice/2;
if(CARDTYPE_C ==
pstTravelInfo-&enCardType)&
else if(CARDTYPE_B ==
pstTravelInfo-&enCardType)&
return (baseprice*9)/10; &
int ChargeProcess(int nChargePrice, TravelInfo_ST*
pstTravelInfo)&
int nCardID = pstTravelInfo-&nCardNo;
int nLogItems = apiGetLogNum();
//判断扣费票价是否大于卡上余额
if(nChargePrice &
pstTravelInfo-&nCardMoney)
apiPrintOpStatusInfo(I13,nCardID,
pstTravelInfo-&nCardMoney);
apiWriteLog(0,pstTravelInfo,RET_ERROR);
return RET_ERROR;
pstTravelInfo-&nCardMoney =
pstTravelInfo-&nCardMoney - nChargeP
if(CARDTYPE_A ==
pstTravelInfo-&enCardType)
apiPrintOpStatusInfo(I11, nCardID,
pstTravelInfo-&nCardMoney);
if(pstTravelInfo-&nCardMoney &=
apiPrintOpStatusInfo(I11,
pstTravelInfo-&nCardNo,
pstTravelInfo-&nCardMoney);&
apiPrintOpStatusInfo(I12,
pstTravelInfo-&nCardNo,
pstTravelInfo-&nCardMoney);&
apiWriteLog(nChargePrice, pstTravelInfo, RET_OK);
//将扣费记录添加到链表尾
if(RET_OK ==
AddHistoryItemOnListTail(nChargePrice,pstTravelInfo))
return RET_OK;
return RET_ERROR;
//将扣费记录添加到链表尾函数
int AddHistoryItemOnListTail(int nChargePrice, TravelInfo_ST*
pstTravelInfo )
HistoryItem historyI
memset(&historyItem, 0,
sizeof(HistoryItem));&
historyItem.enCardType =
pstTravelInfo-&enCardT
historyItem.nCardNo =
pstTravelInfo-&nCardNo;
historyItem.nInHour =
pstTravelInfo-&nInH
historyItem.nInMin =
pstTravelInfo-&nInM
historyItem.nMoney = nChargeP
historyItem.nOutHour =
pstTravelInfo-&nOutH
historyItem.nOutMin =
pstTravelInfo-&nOutM
int nInStationLen =
strlen(pstTravelInfo-&sInStation);
int nOutStationLen =
strlen(pstTravelInfo-&sOutStation);
memcpy(historyItem.sInStation,
pstTravelInfo-&sInStation, nInStationLen);
memcpy(historyItem.sOutStation,
pstTravelInfo-&sOutStation, nOutStationLen);
if(NULL ==
PushBackNode(g_historyInfoNodeHead,&historyItem))
return RET_ERROR;
return RET_OK;
void Swap(LogItem_ST &logItemA, LogItem_ST
&logItemB)
LogItem_ST
memcpy(&tmp, &logItemA,
sizeof(LogItem_ST));
memcpy(&logItemA, &logItemB,
sizeof(LogItem_ST));
memcpy(&logItemB, &tmp,
sizeof(LogItem_ST));
//利用冒泡排序对卡号进行排序
void SortByCardID(LogItem_ST logItems[], int nItems)
if(NULL == logItems || nItems &= 0)
int i = 0, k = nI
int flag = 1;
while(flag)
for (i = 1; i & i )
if (logItems[i - 1].nCardNo &
logItems.nCardNo)
Swap(logItems[i - 1], logItems);
int IsCheckTimeValid(QueryCond_ST* pstQueryCond, LogItem_ST
if(NULL == pstQueryCond || NULL == logAddr)
apiPrintErrInfo(E99);
return RET_ERROR;
int nQueryStartHour =
pstQueryCond-&nStartH
int nQueryStartMin =
pstQueryCond-&nStartM
int nQueryEndHour =
pstQueryCond-&nEndH
int nQueryEndMin =
pstQueryCond-&nEndM
int nLogStartHour = logAddr-&nInH
int nLogStartMin = logAddr-&nInM
int nLogEndHour = logAddr-&nOutH
int nLogEndMin = logAddr-&nOutM
if((apiTimeDiff(nQueryStartHour, nQueryStartMin, nLogEndHour,
nLogEndMin) &= 0)
(apiTimeDiff(nLogEndHour,nLogEndMin,nQueryEndHour,nQueryEndMin)
return RET_OK;
return RET_ERROR;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。c语言,写免杀程序,比如说cf,躲开查杀-土地公问答
c语言,写免杀程序,比如说cf,躲开查杀
c语言,写免杀程序,比如说cf,躲开查杀
c语言,写免杀程序,比如说cf,躲开查杀
网上有免杀教程,你搜一下.
其它类似问题
其它人正在问的问题哪位大神知道地铁检票机的C语言编程!?跪求!_百度知道
哪位大神知道地铁检票机的C语言编程!?跪求!
我有更好的答案
如果一样的程序肯定是没有的!
你要实现什么功能呢,详细说明一下,可以根据你的需要写程序
采纳率:62%
为您推荐:
其他类似问题
c语言编程的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 单位机构代码查询系统 的文章

 

随机推荐