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邻接矩阵:根据写题经验,如果可以用矩阵那一定是首选,矩阵速度比表快而且题目出现多重边时矩阵很好解决。
 
 
优先队列还没有学啊
 

posted on 2012-08-14 19:42  矮人狙击手!  阅读(875)  评论(2编辑  收藏  举报

导航