此題求牛從起點到終點路徑中最大權值最小的那條路徑,將Floyd演算法稍作修改即可,注意此題輸入輸出處理不當可能引起逾時,一般scanf及printf更節省時間。
#include <iostream><br />#include <cstdio><br />#define MAX_VEX 305<br />#define MAX_WEI 1000005<br />using namespace std;<br />int A[MAX_VEX][MAX_VEX];<br />//用cin,cout會逾時<br />int main(){<br />int N,M,T,i,j,k,h;<br />int s,e,w;<br />//cin>>N>>M>>T;<br />scanf("%d%d%d",&N,&M,&T);<br />for (i = 1;i <= N;i++)<br />for (j = 1;j <= N;j++)<br />{<br />A[i][j] = MAX_WEI;<br />}<br />for (i = 0; i < M;i++)<br />{<br />//cin>>s>>e>>w;<br />scanf("%d%d%d",&s,&e,&w);<br />A[s][e] = w;<br />}<br />//關鍵代碼部分<br />for (i = 1;i <= N;i++)<br />for (j = 1;j <= N;j++){<br />if (A[j][i] == MAX_WEI)<br />continue;//i,j之間不可直達<br />for (k = 1;k <= N;k++){<br />if (A[i][k] == MAX_WEI) continue;<br />h = A[j][i] > A[i][k]?A[j][i]:A[i][k];<br />if(h < A[j][k]) A[j][k] = h;<br />}<br />}<br />for (i = 0;i < T;i++){<br />//cin>>s>>e;<br />scanf("%d%d",&s,&e);<br />if (A[s][e] == MAX_WEI) //cout<<"-1"<<endl;<br />printf("-1/n");<br />else //cout<<A[s][e]<<endl;<br />printf("%d/n",A[s][e]);<br />}<br />return 0;<br />}<br />