這個題意實在是太模糊了,我也是聽了大佬的解釋才明白的。
我可以再次翻譯一遍題意qaq:
找出在一條邊斷掉的情況下的單源最短路徑,並輸出最壞的情況(去邊不同會影響最短路)。
完了???
完了。。。
所以思路就出來了:一一去掉所有邊,分別去求最短路。
仔細想想:時間複雜度(dijkstra)o(n^2*m)
如果是dalao寫帶堆優化的也會到 o(nlogn*m)
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define go(i, j, n, k) for (int i = j; i <= n; i += k)
#define fo(i, j, n, k) for (int i = j; i >= n; i -= k)
#define rep(i, x) for (int i = h[x]; i; i = e[i].nxt)
#define mn 1010
#define inf 1 << 30
#define ll long long
#define ld long double
#define fi first
#define se second
#define root 1, n, 1
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define bson l, r, rt
inline int read()
while (ch >= '0' && ch <= '9')
return x * f;
}inline void write(int x)
//this is ac head above...
struct edge e[(mn * (mn-1)) >>1];
int h[mn],p;
inline void add(int a,int b,int c)
//dij + 堆優化
struct node
};//過載運算子
int n,m,s,pp;
int dis[mn];//起點到每個點的距離
int pre[mn], per[mn];
inline void dij()}}
}int maxx=-1;
int main()
go(i,1,m*2,1)
//cout << "\n";
cout << maxx;
return 0;
}
不過時間複雜度太高了!!!怎麼辦???
不慌,慌也沒用。
我們不是分析過題嗎?去掉一條邊的單源最短路。如果去的邊不是不刪邊情況下的單源最短路徑上的邊,那麼會對最終答案有影響嗎?
沒有!所以,我們只需要看一看單源最短路上的邊分別去掉會是什麼情況就可以了。正常操作是先跑一遍dijkstra(最短路),然後再去記錄單源最短路上經過的邊,把路過的邊分別去掉,分別跑一邊單源最短路取最大值就好啦!
所以,**如下:(在記錄路過的邊和刪邊上我會在注釋裡解釋的qwq)
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
#define go(i, j, n, k) for (int i = j; i <= n; i += k)
#define fo(i, j, n, k) for (int i = j; i >= n; i -= k)
#define rep(i, x) for (int i = h[x]; i; i = e[i].nxt)
#define mn 1010
#define inf 1 << 30
#define ll long long
#define ld long double
#define fi first
#define se second
#define root 1, n, 1
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
#define bson l, r, rt
inline int read()
while (ch >= '0' && ch <= '9')
return x * f;
}inline void write(int x)
//this is ac head above...
struct edge e[(mn * (mn-1)) >>1];//這個地方注意邊的最大條數
int h[mn],p;
inline void add(int a,int b,int c)
//dij + 堆優化
struct node
};//過載運算子
int n,m,s,pp;
int dis[mn];//起點到每個點的距離
int pre[mn], per[mn];
inline void dij(bool zzz)
node ppp;
ppp.u = dis[v], ppp.v = v;
q.push(ppp);}}
}}int maxx=-1;
int main()
dij(true);//沒有刪邊的最短路(應同學們需求,我寫的dijkstra)
//go(i,1,n,1)
//cout << "\n";
pp = n;
while(pp!=1)
//cout << "\n";
cout << maxx;
return 0;
}
第七次寫題解,希望可以幫到寫dijkstra但被慘遭tle而80分的同學,有錯誤請dalao們多多指教 洛谷 P1186 瑪麗卡
這道題題目真的想吐槽一下.是在機房同學的解釋下才看懂的。就是讓你求在可以刪一條邊的情況下,並且刪後保證可以到達終點時,求刪了後的最大的最短路徑。70分暴力思路 列舉刪邊,然後跑一下最短路即可,思路很簡單,下面給出70分 include using namespace std vector e 101...
洛谷P1186瑪麗卡
先跑一遍最短路,將最短路的路徑記錄下來,然後列舉每一條最短路的邊,將其斷掉,記錄此時的1 n的時間,取其中最大的乙個時間即為所求。通過 cut 和 f 進行操作 注意這個題是個稠密圖,可能會卡 spfa 所以我用了堆優化 dijk include include include include in...
洛谷 P1186 瑪麗卡
麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路...