給出一張有n個點m條邊的加權有向無環圖,接下來有q個詢問,每個詢問包括2個節點x和y,要求算出從x到y的一條路徑,使得密度最小(密度的定義為,路徑上邊的權值和除以邊的數量)。
輸入格式:
第一行包括2個整數n和m。
以下m行,每行三個數字a、b、w,表示從a到b有一條權值為w的有向邊。
再下一行有乙個整數q。
以下q行,每行乙個詢問x和y,如題意所訴。
輸出格式:
對於每個詢問輸出一行,表示該詢問的最小密度路徑的密度(保留3位小數),如果不存在這麼一條路徑輸出「omg!」(不含引號)。
輸入樣例#1: 複製
3 3輸出樣例#1: 複製1 3 5
2 1 6
2 3 6
21 3
2 3
5.0005.500
主要是有乙個除數很難處理
看了大佬的題解才發現
可以對floyed加一層邊數
這樣問題就解決了
#includeusingview codenamespace
std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ri(n) scanf("%d",&(n))
#define rii(n,m) scanf("%d%d",&n,&m)
#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define rs(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define rep(i,n) for(int i=0;i
#define clr(a,v) memset(a,v,sizeof a)
/////////////////////////////////
/#define inf 0x3f3f3f3f
const
int n=100
;const
int m=4e6+54
;int dp[n][n][11*n],n,m,a,b,c,q;
double
ans,minn;
intmain()
rep(l,
2,m)
rep(k,
1,n)
rep(i,
1,n)
rep(j,
1,n)
dp[i][j][l]=min(dp[i][j][l],dp[i][k][l-1]+dp[k][j][1
]); ri(q);
rep(i,
1,q)
if(ans!=inf)printf("
%.3lf\n
",ans);
else cout<
omg!
"<
}return0;
}
最小密度路徑 洛谷p1730
給出一張有n個點m條邊的加權有向無環圖,接下來有q個詢問,每個詢問包括2個節點x和y,要求算出從x到y的一條路徑,使得密度最小 密度的定義為,路徑上邊的權值和除以邊的數量 輸入格式 第一行包括2個整數n和m。以下m行,每行三個數字a b w,表示從a到b有一條權值為w的有向邊。再下一行有乙個整數q。...
洛谷P1730 最小密度路徑
題目大意 給定乙個 n 個點,m 條邊的有向圖,現有 q 個詢問,每次詢問 x 到 y 的最小密度路徑是多少。最小密度路徑的定義是路徑長度除以路徑邊數。題解 利用矩陣乘法,可以預處理出從 x 到 y 恰好經過 k 條邊的最短路是多少。對於每次詢問,直接處理處理即可,時間複雜度為 o n 4 注意 恰...
洛谷P1730 最小密度路徑 Floyd
時空限制 1000ms 128mb 題目描述 給出一張有n個點m條邊的加權有向無環圖,接下來有q個詢問,每個詢問包括2個節點x和y,要求算出從x到y的一條路徑,使得密度最小 密度的定義為,路徑上邊的權值和除以邊的數量 輸入格式 第一行包括2個整數n和m。以下m行,每行三個數字a b w,表示從a到b...