搜狗2019秋招的一道算法題:龜兔賽跑

時間限制:3秒node

空間限制:92160Kui

定義以下圖所示的比賽地圖:
 
S表示比賽起點,E表示比賽終點。實線表示陸路,虛線表示水路。兔子只能走陸路,烏龜既能夠走陸路也能夠走水路。每條路徑的長度在圖中給出。假定兔子和烏龜足夠聰明,問誰先到達終點。

輸入描述:
第1行輸入v1,v2。v1是兔子的速度,v2是烏龜的速度(水路、陸路速度相同)。第2行輸入n,m,點的編號是1~n,而後是m行,其中1是起點,n是終點(路徑自己不限定方向)。下面m行4個數 a, b, d, c,表示a和b之間有一條邊,且其長度爲d,類型是c(0表示陸路,1表示水路)。最後一行是end,表示輸入結束。輸入保證1和n之間至少有一條路徑聯通。(1<n<=10000, 0<m<=1000000)。

輸出描述:
輸出-1,0,1中的一個數。-1表示烏龜獲勝,1表示兔子獲勝,0表示同時到達終點。

輸入例子1:
10 5
3 3 
1 2 30 0
2 3 20 0
1 3 20 1
end

輸出例子1:
-1

聲明:這道題在牛客提交只過了90%的數據,拿到了45分,最後一個樣例沒過,思考了好久,認爲都考慮到了,又看了下分數排名,我認爲他們的最後一個比較大的case數據有問題。若是有人都過了case
也能夠留下評論,我哪裏寫錯了。
代碼以下:
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <vector>
#define INF 2100000000

using namespace std;

int n, m;
struct node
{
    int point; //端點
    int weight; //路徑長度
    bool worl; //是否水路
};
vector<node>amap[10010];
unsigned int dis[10010];
bool vis[10010];

int Dijkstra(bool torr)
{
    memset(vis, false, sizeof(vis));
    for(int i=1; i<=n; i++) {
        dis[i] = INF; //表明不可達
    }
    int len = amap[1].size();

    if(torr) {
        for(int i=0; i<len; i++) {
            if( amap[1][i].weight < dis[amap[1][i].point] )
                dis[amap[1][i].point] = amap[1][i].weight;
        }
    } else {
        for(int i=0; i<len; i++) {
            if( !amap[1][i].worl && amap[1][i].weight < dis[amap[1][i].point] )
                dis[amap[1][i].point] = amap[1][i].weight;
        }
    }

    vis[1] = true;

    for(int k=0; k<n-1; k++) {
        int pos, mdis = INF;

        for(int i=1; i<=n; i++) {
            if(!vis[i] && dis[i] < mdis) {
                mdis = dis[i]; pos = i;
            }
        }
        vis[pos] = true;
        len = amap[pos].size();

        if(torr == true) { // 烏龜的話,全部的dis均可以拿來更新
            for(int j=0; j<len; j++) {
                if( !vis[amap[pos][j].point] && dis[amap[pos][j].point] > (amap[pos][j].weight+dis[pos]) ) {
                    dis[ amap[pos][j].point ] = amap[pos][j].weight + dis[pos];
                }
            }
        } else { // 兔子的話,更新的可選路徑必須是陸路
            for(int j=0; j<len ; j++) {
                if( !vis[amap[pos][j].point] && !amap[pos][j].worl && dis[amap[pos][j].point] > (amap[pos][j].weight+dis[pos]) )
                    dis[ amap[pos][j].point ] = amap[pos][j].weight + dis[pos];
            }
        }
    }
    return dis[n];
}

int main()
{
    double vt, vg;
    scanf("%lf %lf", &vt, &vg);
    scanf("%d %d", &n, &m);

    int a, b, c, d;
    node cur;
    for(int i=0; i<m; i++) {
        scanf("%d %d %d %d", &a, &b, &c, &d);
        cur.point = b;
        cur.weight = c;
        cur.worl = (d==1?true:false);
        amap[a].push_back(cur);
    }
    char str[100];
    scanf("%s", str);

    double tt = (double)Dijkstra(false) / vt; // tu zi
    double tg = (double)Dijkstra(true) / vg; // gui

    double eps = 1e-8;
    if(fabs(tt - tg) < eps) {
        printf("0\n");
    } else if(tt - tg > eps) {
        printf("-1\n");
    } else {
        printf("1\n");
    }
    return 0;
}
相關文章
相關標籤/搜索