POJ 1847 - Shortest Path Dijstra>SPFA

来源:互联网 发布:我国纯网络银行有哪些 编辑:程序博客网 时间:2024/05/17 01:02

1.Question:

又一个火车网络系统
输入第一行:
n,a,b
分别代表网络中 节点的个数,初始节点,终止节点
接下来n行分别代表第i个节点的有向边的终点
每一行第一个代表的是有向边的个数,之后的第一个有向边的权值是0,之后的权值都是1
现在请给出从a到b的最短的路径权值和

2.Solution:

本题是标准的最短路径的问题
并且数据量比较水,所以说,我们的很多的最短路径好的算法都可以完成,不仅仅是单源最短路径,我们的Floyed的全局最短路径算法甚至也可以在题目的限制时间内完成
我在代码中对三种算法
Dijstra,SPFA,Floyed算法都进行了测试
在最终的权衡下,SPFA算是相对的额效率最高的一种算法(当然,针对这道题的单元最短路的性质之下)

3.Code:

#include"iostream"#include"cstdio"#include"cstring"#include"cstdlib"#define N 105#define INF 0x7ffffffusing namespace std;int dis[N];int n,a,b,k;bool book[N];int map[N][N];/*Problem: 1847 User: lantianheyeqiMemory: 732K Time: 32MSLanguage: G++ Result: Acceptedvoid dijstra(){memset(book,0,sizeof(book));for(int i=1;i<=n;i++){dis[i]=map[a][i];}book[a]=1;dis[a]=0;for(int i=1;i<=n-1;i++){int mink=INF;int minpoint;for(int j=1;j<=n;j++){if(book[j]==0&&dis[j]<mink){mink=dis[j];minpoint=j;}}book[minpoint]=1;for(int j=1;j<=n;j++){if(book[j]==0&&map[minpoint][j]<INF&&dis[j]>dis[minpoint]+map[minpoint][j]){dis[j]=dis[minpoint]+map[minpoint][j];}}}}*//*Problem: 1847 User: lantianheyeqiMemory: 736K Time: 16MSLanguage: G++ Result: Acceptedvoid SPFA(){memset(book,0,sizeof(book));for(int i=1;i<=n;i++){dis[i]=INF;}book[a]=1;dis[a]=0;int queue[N*N];int head=1;int tail=2;queue[1]=a;while(head!=tail){for(int i=1;i<=n;i++){if(map[queue[head]][i]<INF&&dis[i]>dis[queue[head]]+map[queue[head]][i]){dis[i]=dis[queue[head]]+map[queue[head]][i];if(book[i]==0){book[i]=1;queue[tail++]=i;}}}book[queue[head]]=0;head++;}}*//*Problem: 1847 User: lantianheyeqiMemory: 732K Time: 32MSLanguage: G++ Result: Accepted*/void floyed(){for(int k=1;k<=n;k++)for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; } }}int main(){while(scanf("%d%d%d",&n,&a,&b)!=EOF){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j) map[i][j]=0;   //小心这一句 else map[i][j]=INF;}} for(int i=1;i<=n;i++){scanf("%d",&k);for(int j=1;j<=k;j++){int dy;scanf("%d",&dy);if(j==1) map[i][dy]=0;else map[i][dy]=1;}}//dijstra();//SPFA();floyed();if(map[a][b]==INF) printf("-1\n");else printf("%d\n",map[a][b]);//if(dis[b]==INF) printf("-1\n");//else printf("%d\n",dis[b]);    }return 0;}

0 0
原创粉丝点击