hdu1596(最短路径问题)
最短路径的变形,刚开始用g++交,一直超时,后来改用c++交就过了,看来还是c++比较给力
#include <stdio.h> #define max(e1,e2) ((e1)>(e2)?(e1):(e2)) double safe[1005][1005]; int n; int main() { while(scanf("%d",&n)!=EOF) { //cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { //cin>>safe[i][j]; scanf("%lf",&safe[i][j]); } } for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { if(safe[i][k]>0.00000001) for(int j=1;j<=n;j++) { safe[i][j]=max(safe[i][k]*safe[k][j],safe[i][j]); } } } int q; //cin>>q; scanf("%d",&q); int start,end; for(int i=0;i<q;i++) { //cin>>start>>end; scanf("%d%d",&start,&end); if(safe[start][end]<0.00000001) printf("What a pity!\n"); else printf("%.3lf\n",safe[start][end]); } } return 0; }
另外,这里再说几个用时更少的方法:
1:使用宏定义
2:使用内联函数
3:最基本的一个c语言的输入输出
4:换一种更好的算法
下面换一种更快的算法
1 #include <cstring> 2 #include <stdio.h> 3 #define Max -1 4 const double esp=1e-11; 5 double safe[1005][1005]; 6 double dis[1005]; 7 int visited[1005]; 8 int n; 9 int start,end; 10 void Dijkstra() 11 { 12 int pos; 13 dis[start]=1; 14 for(int i=1;i<=n;i++) 15 { 16 double max=Max; 17 for(int j=1;j<=n;j++) 18 { 19 if(dis[j]>max && visited[j]==0) 20 { 21 max=dis[j]; 22 pos=j; 23 } 24 } 25 if(pos==end) return; 26 visited[pos]=1; 27 for(int j=1;j<=n;j++) 28 { 29 if(visited[j]==0) 30 { 31 if(dis[j]<safe[pos][j]*dis[pos]) 32 { 33 dis[j]=safe[pos][j]*dis[pos]; 34 } 35 } 36 } 37 } 38 } 39 40 int main() 41 { 42 43 while(scanf("%d",&n)!=EOF) 44 { 45 46 for(int i=1;i<=n;i++) 47 { 48 for(int j=1;j<=n;j++) 49 { 50 //cin>>safe[i][j]; 51 scanf("%lf",&safe[i][j]); 52 53 } 54 } 55 int q; 56 scanf("%d",&q); 57 for(int i=0;i<q;i++) 58 { 59 memset(dis,0,sizeof(dis)); 60 memset(visited,0,sizeof(visited)); 61 //cin>>start>>end; 62 scanf("%d%d",&start,&end); 63 Dijkstra(); 64 if(safe[start][end]<0.00000001) printf("What a pity!\n"); 65 else 66 printf("%.3lf\n",dis[end]); 67 68 } 69 } 70 return 0; 71 }
在别人的博客上看到这样一句话:
最短路算法众多有floyd、dij、bell-man、spfa,速度最快就是dij+优先队列或者dij+堆排序,spfa理论上很快o(ke)但实际并不一定不过spfa传说中有一个很NB用处就是处理带负权回路。
邻接表VS邻接矩阵:根据写题经验,如果可以用矩阵那一定是首选,矩阵速度比表快而且题目出现多重边时矩阵很好解决。
优先队列还没有学啊