題目描述:
麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。
因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。
在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。
麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路正在維修,從瑪麗卡所在的城市都能到達麥克所在的城市。
瑪麗卡將只從不堵車的路上通過,並且她將按最短路線行車。麥克希望知道在最糟糕的情況下瑪麗卡到達他所在的城市需要多長時間,這樣他就能保證他的女朋友離開該城市足夠遠。
編寫程式,幫助麥克找出瑪麗卡按最短路線通過不堵車道路到達他所在城市所需的最長時間(用分鐘表示)。
輸入描述:
第一行有兩個用空格隔開的數n和m,分別表示城市的數量以及城市間道路的數量。1≤n≤1000,1≤m≤n*(n-1)/2。城市用數字1至n標識,麥克在城市1中,瑪麗卡在城市n中。
接下來的m行中每行包含三個用空格隔開的數a,b和v。其中1≤a,b≤n,1≤v≤1000。這些數字表示在a和城市b中間有一條雙行道,並且在v分鐘內是就能通過。
輸出描述:
輸出檔案的第一行中寫出用分鐘表示的最長時間,在這段時間中,無論哪條路在堵車,瑪麗卡應該能夠到達麥克處,如果少於這個時間的話,則必定存在一條路,該條路一旦堵車,瑪麗卡就不能夠趕到麥克處。
樣例輸入:
5 7
1 2 8
1 4 10
2 3 9
2 4 10
2 5 1
3 4 7
3 5 10
樣例輸出:
27思路:
把某一條邊去掉之後使得去掉後的最短路最長,所以我們列舉去掉的邊,但是想一下如果去掉的邊不在原來最短路上,那對於最短路是沒有影響的,所以我們只列舉去掉最短路上得邊,然後每次去掉一條,找出所有最短路的最大值就行了。
#include
#include
using
namespace
std;
const
int maxn=1010;
const
int maxx=1000000;
struct node
e[maxn*maxn/2];
queue
q;bool flag[maxn];
int n,m,tot,ans,head[maxn],pre[maxn],dis[maxn];
void edd_edge(int u,int v,int w)
void spfa(int s)}}
}}void fspfa(int start,int end)}}
}ans=max(ans,dis[n]);
}int main()
spfa(1);
for(int i=n;i;i=pre[i])
fspfa(pre[i],i);
cout
0;}
P1186 瑪麗卡 最短路spfa
麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無論哪一條路...
spfa求最短路
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。資料保證不存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示點x和點y之間存在一條有向邊,邊長為z。輸...
spfa求最短路
題目鏈結 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出1號點到n號點的最短距離,如果無法從1號點走到n號點,則輸出impossible。資料保證不存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊...