洛谷 P1402 酒店之王 網路流

2022-08-03 14:39:23 字數 2408 閱讀 9994

題目描述description

xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調、陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。

有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意(滿意的條件是住進喜歡的房間,吃到喜歡的菜)。

這裡要怎麼分配,能使最多顧客滿意呢?

輸入輸出格式input/output

輸入格式:

第一行給出三個正整數表示n,p,q(<=100)。

之後n行,每行p個數包含0或1,第i個數表示喜不喜歡第i個房間(1表示喜歡,0表示不喜歡)。

之後n行,每行q個數,表示喜不喜歡第i道菜。

輸出格式:

最大的顧客滿意數。

輸入輸出樣例sample input/output

樣例測試點#1

輸入樣例:

2 2 2

1 01 0

1 11 1

輸出樣例:

1分析:

構造乙個圖,模擬出源點s和匯點t,把每個人拆成兩部分,按照s->房間->人->人->飯->t的順序構建圖,跑一遍最大流。可完美解決。

dinic:

#include#include

#include

#include

using

namespace

std;

int n,p,q,s,t,m,ans,a[1000][1000],room[201][201],dish[201][201],dis[1000],sq[1000

];

bool

bfs()

} if (dis[t]>0) return

true; else

return

false

; }

int find(int x,int

low)

return

0;

}

intmain()

耗時:91ms

記憶體:6381kb

同校大神寫的sap:

#include#include

#include

#include

using

namespace

std;

int edge[420][420],dis[420],start[420],gap[420],pre[420

];

intmain()

for ( i=1; i<=n; i++) edge[i+p][i+c]++;

for ( i=1; i<=n; i++) for ( j=1; j<=q; j++)

n=b+q+1; gap[0]=n+1

;

for ( i=1; i<=p; i++) edge[0][i]++;

for ( i=b+1; i;

for ( i=0; i<=n; i++) dis[i]=0

;

i=0; flow=0

;

while ( dis[0]<=n )

} break

; }

if ( ll ) continue

; h=n+1

;

for ( j=1; j<=n; j++)

if ( edge[i][j] && dis[j]start[i]=a;

gap[dis[i]]--;

if ( !gap[dis[i]] ) break

; dis[i]=h+1

; gap[dis[i]]++;

if ( i!=0 ) i=pre[i];

} cout

0;

}

耗時:137ms

記憶體:2805kb

就本題來看,構圖差不多的情況下,dinic的時效較高,但記憶體多,spfa時效略遜色,但記憶體少。

合理構圖是關鍵!

洛谷 P1402 酒店之王

題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...

洛谷 P1402 酒店之王

題目描述 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所有顧客滿意...

洛谷P1402 酒店之王

洛谷連線 酒店之王 xx酒店的老闆想成為酒店之王,本著這種希望,第一步要將酒店變得人性化。由於很多來住店的旅客有自己喜好的房間色調 陽光等,也有自己所愛的菜,但是該酒店只有p間房間,一天只有固定的q道不同的菜。有一天來了n個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所...