51nod 1366 貧富差距

sad_lin發表於2024-09-02

51nod 1366 貧富差距

這題題面挺抽象的,一個人與他所以的朋友的錢不能超過 \(d\),問朋友鏈上錢最多的人的錢與錢最少的人的錢相差多少,求差距的最大值 。

如果兩個人不屬於同一個連通塊那麼差距可以無窮大,好了特殊情況解決了。然後為了使這個差距最大,那麼對於每個朋友我們都取 \(d\) 為權值來連一條邊,最後跑最短路可以得到最大差距。

因為這題的圖很稠密,所以用 floyd(其實因為在 floyd 的例題做到的,所以不想再改了,但其實這資料範圍也該這麼寫)

#include<bits/stdc++.h>
using namespace std;
const int N=100;
const int inf=0x3f3f3f3f;
int n,d; 
int dp[N][N];

int main(){
	ios::sync_with_stdio(false);
	int t;
	cin>>t;
	while(t--){
		cin>>n>>d;
		char c;
		
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				cin>>c;
				dp[i][j]=inf;
				dp[j][i]=inf;
				dp[i][i]=0;
				if(c=='Y'){
					dp[i][j]=dp[j][i]=d;
				} 
			}
		}
		
		for(int k=1;k<=n;k++){
			for(int i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
				}
			}
		}
		int mx=0;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				mx=max(mx,dp[i][j]);
			}
		}
		if(mx>=inf){
			cout<<-1;
		} 
		else{
			cout<<mx;
		}
		cout<<"\n";
	}
	return 0; 
}

相關文章