題目描述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個客人,每個客人說出了自己喜歡哪些房間,喜歡哪道菜。但是很不幸,可能做不到讓所...