HDU 1596 find the safest road

http://acm.hdu.edu.cn/showproblem.php?pid=1596

floyd 貌似超时 (代码转载)

View Code

dijkstra + heap优化 

 这题因为是不知道有多少个query 所以直接用dij 应该会更快

View Code
#include <stdio.h>
#include <string.h>

const int MAXN = 1010;
double map[MAXN][MAXN], dis[MAXN];
bool set[MAXN];
int size = 0, heap[MAXN], pl[MAXN], n;
void exchange(int a, int b)
{
    int temp ;
    temp = heap[a], heap[a] = heap[b], heap[b] = temp;
    pl[heap[a]] = a, pl[heap[b]] = b; //attention~ 刚开始我是pl[heap[a]] = a, 弄反了
}
void filterDown(int i)
{
    if(i*2 <= size && (dis[heap[i]] < dis[heap[i*2]]) )
    {
        exchange(i, i*2);
        filterDown(i*2);
    }
    if( i*2+1 <=size && (dis[heap[i]] < dis[heap[i*2+1]]) )
    {
        exchange(i, i*2+1);
        filterDown(i*2+1);
    }
}void filterUp(int i)
{
    if( i/2 >=1 && (dis[heap[i]] > dis[heap[i/2]]))
    {
        exchange(i, i/2);
        filterUp(i/2);
    }
}
void insert(int i)
{
    heap[++size] = i;
    pl[i] = size;
    filterUp(size);
}

void remove()
{
    int index = heap[1];
    exchange(1, size);
    size -- ;
    set[index] = 1;
    filterDown(1);
    for(int i=1; i<=n; i++)
    {
        if(!set[i] && dis[i] < map[index][i]*dis[index])
        {
            dis[i] = map[index][i]*dis[index];
            filterUp(pl[i]);
        }
    }
}
void dij(int src)
{
    int i;
    memset(dis, 0, sizeof(dis));
    memset(set, 0, sizeof(set));
    size = 0;
    for(i=1; i<=n; i++)
        dis[i] = map[src][i];
    for(i=1; i<=n; i++)
        insert(i);
    for(i=1; i<=n; i++)
    {
        remove();
    }
}

int main()
{
    int i, j, q, c1, c2;
    while(scanf("%d", &n)!=EOF)
    {
        size = 0;
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
            {
                scanf("%lf", &map[i][j]);
            }
            scanf("%d", &q);
            for(i=1; i<=q; i++)
            {
                scanf("%d %d", &c1, &c2);
                dij(c1);
                if(dis[c2]!=0)
                    printf("%.3lf\n", dis[c2]);
                else
                    printf("What a pity!\n");
            }
    }
}

 

 这个是用stl 优先队列搞的dijkstra  wa的代码 求解啊

View Code
#include <stdio.h>
#include <string.h>
#include <queue>

using std::priority_queue;
struct node
{
    int u;
    double dis;
    bool operator < (node a) const
    {    return dis > a.dis; }
};
priority_queue<node> q;
int vis[1005], n;
double map[1005][1005], dis[1005];
double dij(int src, int ed)
{
    int i;
    memset(vis, 0, sizeof(vis));
    while(!q.empty()) q.pop();
    for(i=1; i<=n; i++)
        dis[i] = 0;
    node a;
    a.dis = 1, a.u = src;
    q.push(a);
    dis[src] = 1;
    while(!q.empty())
    {
        node now = q.top(); q.pop();
        vis[now.u] = 1;
        if(now.u == ed)
            return now.dis;
        for(i=1; i<=n; i++)
            if(!vis[i] && dis[i] < dis[now.u] * map[now.u][i])
            {
                dis[i] = dis[now.u]*map[now.u][i];
                a.dis = dis[i];
                a.u = i;
                q.push(a);
            }
    }
    return -1;
}
int main()
{
    int i, j, q, c1, c2;
    while(scanf("%d", &n)!=EOF)
    {
    //    size = 0;
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
            {
                scanf("%lf", &map[i][j]);
            }
            scanf("%d", &q);
            for(i=1; i<=q; i++)
            {
                scanf("%d %d", &c1, &c2);
                double res = dij(c1, c2);
                if(res != -1)
                    printf("%.3lf\n", res);
                else
                    printf("What a pity!\n");
            }
    }
    return 0;
}

 

posted @ 2013-03-08 11:38  April_Tsui  阅读(184)  评论(0编辑  收藏  举报