時間限制:3秒node
空間限制:92160Kui
第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表示同時到達終點。
10 5 3 3 1 2 30 0 2 3 20 0 1 3 20 1 end
-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; }