Floyd演算法--+貪心演算法
阿新 • • 發佈:2019-01-01
題目大意:
給你n個站,有m條邊,每條邊有一個耗費值。
問你如果A站到B站可通,選一條路,每條可行路徑上的相鄰兩站的耗費值有一個確定的最大值,使得儘量讓這個值最小,輸出。
否則輸出-1.(有向無環圖)
分析:
先確定任意兩站間的最短路徑,再找最大耗費值
#include <iostream> #include <cstring> #include <iomanip> #include <cmath> #include <cstdio> #define K 99999999 using namespace std; int N,M,T; void solve (int edge[][301]) { for(int k=0;k<N;k++) { for(int i=0;i<N;i++) for(int j=0;j<N;j++) edge[i][j]=min(edge[i][j],edge[i][k]+edge[k][j]); //得最短路徑 } //在所有可行路徑中選出最大障礙中最小的值 for(int k=0;k<N;k++) for(int i=0;i<N;i++) for(int j=0;j<N;j++) if(edge[i][j]<K) { //①如果edge[i][j]是由更新而來的,可行路徑中的最大障礙的最小值max(edge[i][k],edge[k][j])一定<原來的edge[i][j](edge[i][k]+edge[k][j]<edge[i][j]) //②如果edge[i][j]等於原先的值,即edge[i][k]+edge[k][j]>edge[i][j];在兩條路徑中的最大障礙中選出最小的而一個 edge[i][j]=min(edge[i][j],max(edge[i][k],edge[k][j])); } return ; } int main() { while(scanf("%d%d%d",&N,&M,&T)!=EOF) { int edge[301][301]; int i,j,row,col,value; memset(edge,0x3f,sizeof(edge)); for(i=0;i<M;i++) { scanf("%d%d",&row,&col); scanf("%d",&edge[row-1][col-1]); } solve(edge); /* cout<<"得到的最大障礙表:"<<endl; for(i=0;i<N;i++) { for(j=0;j<N;j++) cout<<left<<setw(8)<<edge[i][j]<<" "; cout<<endl; } */ int start,over; for(i=0;i<T;i++) { scanf("%d%d",&start,&over); if(edge[start-1][over-1]>=K ) printf("-1\n"); else printf("%d\n",edge[start-1][over-1]); } } return 0; }