[PTA] Week 11 4-16 Shortest Path [3] (25分)
2015-12-26 15:48
661 查看
#include <stdio.h> #include <stdlib.h> typedef enum {false, true} bool; #define INFINITY 1000000 #define MaxVertexNum 10 /* maximum number of vertices */ typedef int Vertex; /* vertices are numbered from 0 to MaxVertexNum-1 */ typedef int WeightType; typedef struct GNode *PtrToGNode; struct GNode{ int Nv; int Ne; WeightType G[MaxVertexNum][MaxVertexNum]; }; typedef PtrToGNode MGraph; MGraph ReadG(); /* details omitted */ void ShortestDist( MGraph Graph, int dist[], int path[], Vertex S ); int main() { freopen("test.txt","r",stdin); int dist[MaxVertexNum], path[MaxVertexNum]; Vertex S, V; MGraph G = ReadG(); scanf("%d", &S); ShortestDist( G, dist, path, S ); for ( V=0; V<G->Nv; V++ ) printf("%d ", dist[V]); printf("\n"); for ( V=0; V<G->Nv; V++ ) printf("%d ", path[V]); printf("\n"); return 0; } MGraph ReadG() { int i,j; int w,v,x; MGraph p; p=(PtrToGNode)malloc(sizeof(struct GNode)); scanf("%d%d",&w,&v); p->Nv=w,p->Ne=v; for(i=0;i<p->Nv;i++){ for(j=0;j<p->Nv;j++){ p->G[i][j]=-1; } } for(i=0;i<p->Ne;i++){ scanf("%d%d%d",&w,&v,&x); p->G[w][v]=x; } return p; } void ShortestDist( MGraph Graph, int dist[], int count[], Vertex S ) { bool visit[MaxVertexNum]; int dist2[MaxVertexNum]; int i; /*初始化 */ for(i=0;i<Graph->Nv;i++){ dist[i]=INFINITY; /*dist[i]代表从S到i的最短距离 */ dist2[i]=INFINITY; count[i]=0; /* count[i]代表从S到i的最短路径条数 */ visit[i]=false; /* 是否访问过该结点 */ } for(i=0;i<Graph->Nv;i++){ if(Graph->G[S][i]>0){ dist[i]=Graph->G[S][i]; } } visit[S]=true; dist[S]=0; /*第一次dijikstra,计算最短路径*/ while(1){ int min=INFINITY; int v=-1; /*得到最小的dist,将v点加入结果,求得从S到v的最短路径dist[v]*/ for(i=0;i<Graph->Nv;i++){ if(!visit[i]){ if(dist[i]<min){ min=dist[i]; v=i; } } } /*找不到最小的dist,跳出循环*/ if(v==-1)break; visit[v]=true; /*扫描v的所有邻接点,如果经过v到其邻接点的距离比已有距离更短,更新最短距离*/ for(i=0;i<Graph->Nv;i++){ if(!visit[i]&&Graph->G[v][i]>0){ if(dist[v]+Graph->G[v][i]<dist[i]){ dist[i]=dist[v]+Graph->G[v][i]; } } } } /*初始化*/ for(i=0;i<Graph->Nv;i++){ if(dist[i]==INFINITY)dist[i]=-1; visit[i]=false; } visit[S]=true; count[S]=1; dist2[S]=0; for(i=0;i<Graph->Nv;i++){ if(Graph->G[S][i]>0){ dist2[i]=Graph->G[S][i]; if(dist2[i]==dist[i]){ count[i]=1; /*如果S到i的直接路径为最短路径,更新最短路径条数 */ } } } /*第二次dijikstra,计算最短路径条数*/ while(1){ int v=-1; int min=INFINITY; for(i=0;i<Graph->Nv;i++){ if(!visit[i]&&dist2[i]<min){ min=dist2[i]; v=i; } } if(v==-1)break; visit[v]=true; for(i=0;i<Graph->Nv;i++){ if(!visit[i]&&Graph->G[v][i]>0){ if(dist2[v]+Graph->G[v][i]<dist2[i]){ dist2[i]=dist2[v]+Graph->G[v][i]; count[i]=count[v]; /* 如果经过v到达i的路径为第一条最短路径, 那么从S到i的最短路径条数等于从S到v的最短路径条数*/ } else if(dist2[v]+Graph->G[v][i]==dist[i]) count[i]+=count[v]; /* 如果经过v到达i的路径为新的最短路径, 那么从S到i的最短路径条数等于从S到i的最短路径条数 加上从S到v的最短路径条数*/ } } } }
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- Robotium 学习
- 访问时加载和项目启动时加载r
- ssh正向和反向隧道建立,及socks4/5代理
- 欢迎使用CSDN-markdown编辑器
- Ibaties 插入数据时,时间字段为空
- Google Analytics多渠道实现
- android 监听网络连接状态的改变
- centos6.5软件安装:RPM,SRPM与yum功能
- gstack - stack trace of a running process
- 《Programming Hive》读书笔记(一)Hadoop和hive环境搭建
- linux实战案例(1)
- android system.exit(0)后会重启
- 第七课 分支结构体验
- C++实现的小型图书管理系统
- Xcode添加代码片段
- 调试-计时函数
- arm9+linux fl2440 的编译驱动时遇到的问题
- Servlet中的过滤器Filter详解
- Android编程开发实现带进度条和百分比的多线程下载