ZOJ2504 Help John!,Floyd算法会TLE,只能用Dijkstra算法了
2011-08-17 21:27
411 查看
前面几天都是做Floyd算法的题,再加上理解错题目,碰到这题就惯性的用Floyd算法了,在ZOJ上会TLE。后来看了一些解题报告,了解了从1出发,下一个到达的路口是母亲规定的第二个路口,就好像例子中的2和2。所以这题可以直接用Dijkstra算法来搞,直接从第二个路口开始Dijkstra,时间复杂度为O(n^2)。
/******************************************************************************* # Author : Neo Fung # Email : neosfung@gmail.com # Last modified: 2011-08-17 21:22 # Filename: ZOJ2504 Help John!.cpp # Description : ******************************************************************************/ // ZOJ2504 Help John!.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <memory.h> using namespace std; #define MAX_NUM 1002 #define INF 2000000 int main(void) { // ifstream cin("data.txt"); int ncases; int n,m,k; int map[MAX_NUM][MAX_NUM]; int path[MAX_NUM]; int dijtstra[MAX_NUM]; int meet; int a,b,len; scanf("%d",&ncases); for(int casenum=1;casenum<=ncases;++casenum) { int oldtotal(0),newtotal(INF); int flag(1); memset(path,0,sizeof(path)); memset(dijtstra,0,sizeof(dijtstra)); for(int i=0;i<MAX_NUM;++i) { for(int j=0;j<MAX_NUM;++j) { map[i][j]=INF; } map[i][i]=0; } scanf("%d %d",&n,&m); for(int i=0;i<m;++i) { scanf("%d %d %d",&a,&b,&len); map[a][b]=len; map[b][a]=len; } scanf("%d",&k); a=1; for(int i=0;i<k;++i) { scanf("%d",&b); if (i==1) { meet=b; } if(map[a][b]<INF) { oldtotal +=map[a][b]; a=b; } else { flag=0; break; } } if(!flag) { printf("TEST %d N\n",casenum); continue; } for(int i=1;i<=n;++i) { dijtstra[i]=map[meet][i]; } path[1]=1; path[meet]=1; for(int i=1;i<n;++i) { int min(INF); int index(1); for(int j=1;j<=n;++j) { if(!path[j] && (min>dijtstra[j]) && dijtstra[j]<INF) { min=dijtstra[j]; index=j; } } path[index]=1; for(int j=1;j<=n;++j) { if(!path[j] && (map[index][j]<INF) && (dijtstra[j]>map[index][j]+dijtstra[index])) { dijtstra[j]=map[index][j]+dijtstra[index]; } } } newtotal=dijtstra +map[1][meet]; printf("TEST %d Y %d\n",casenum,oldtotal-newtotal); } return 0; }
相关文章推荐
- ZOJ 2504 Help John! 【最短路】 【Dijkstra】
- ZOJ 2504 Help John! (dijkstra)
- ZOJ 2504 Help John!
- zoj 2504 help john
- zoj 2504 Help John!(Dijkstra~~)
- 最短路径—Dijkstra算法和Floyd算法
- 最短路径算法--Dijkstra算法,Bellmanford算法,Floyd算法,Johnson算法
- 最短路径—Dijkstra算法和Floyd算法(理解)
- 最短路径—Dijkstra算法和Floyd算法
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
- 最短路径—Dijkstra算法和Floyd算法
- ZOJ1655 Transport Goods,Dijkstra算法
- ZOJ 3640 Help Me Escape
- 最短路径算法 Dijkstra算法 Floyd算法 简述
- 【转】最短路径—Dijkstra算法和Floyd算法
- zoj 3640 Help Me Escape 概率DP
- ZOJ-3640 Help Me Escape 概率DP
- 最短路径—Dijkstra算法和Floyd算法
- ZOJ 1655 (Dijkstra算法+一点变化)
- 最短路径—Dijkstra算法和Floyd算法