food
有f種食物和d種飲料,每種食物或飲料只能供有限次,且每個人只享用一種食物和一種飲料。現在有n個人,每個人都有自己喜歡的食物種類列表和飲料種類列表,問最多能使幾個人同時享用到自己喜歡的食物和飲料。
鄰接矩陣 dinic 在定點數較多的時候比較慢。time 608 ms 。鄰接表可以加速
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include7 #include 8 #include
9 #include 10 #include 11 #include 12 #include 13 #include 14
using
namespace
std;
15 typedef long
long
ll;16
const
int inf = 0x4fffffff;17
const
double exp = 1e-5;18
const
int ms = 205;19
const
int size = 100005;20
21int edges[4*ms][4*ms];
22int level[4*ms];
23int que[6*ms];
24char
str[ms];
25int
qs,qe;
26int
n,f,d,cnt;
2728
bool
bfs()
2944}45
}46return level[cnt]>0;47
}4849int dfs(int u,int
minv)
5062
}63 level[u]=0xff;64
return0;
65}6667
intmain()
6878
//0 1--> f, f+1--->f+n, f+n+1 --> f+2*n f+2*n+1-->f+2*n+d f+2*n+d+1;
79for(int i=1;i<=n;i++)
80 edges[f+i][f+n+i]=1
;81 cnt=f+2*n+d+1;82
for(int i=1;i<=d;i++)
8387
for(int i=1;i<=n;i++)
8896}97
}9899for(int i=1;i<=n;i++)
100108
}109
}110
int ans=0
;111
intt;
112while
(bfs())
113118
}119 printf("
%d\n
",ans);
120}
121return0;
122 }
time 124ms
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include7 #include 8 #include
9 #include 10 #include 11 #include 12 #include 13 #include 14
using
namespace
std;
15 typedef long
long
ll;16
const
int inf = 0x4fffffff;17
const
double exp = 1e-5;18
const
int ms = 805;19
const
int size = 200005;20
2122
struct
edge
23edges[size];
2627
inthead[ms];
28int
level[ms];
29int
que[ms];
30int
qs,qe,cnt;
31int
n,f,d;
32int
src,des;
3334
void add(int u,int v,int
w)35
3940
intbfs()
4157}58
}59return level[des]>0;60
}6162int dfs(int u,int
minv)
6376
}77 level[u]=-1; //
從u出發無法找到argument
78return0;
79}8081
82int
main()
8396
//0 1--> f, f+1--->f+n, f+n+1 --> f+2*n f+2*n+1-->f+2*n+d f+2*n+d+1;
97for(int i=1;i<=n;i++)
98 add(f+i,f+n+i,1
);99
for(int i=1;i<=d;i++)
100104
for(int i=1;i<=n;i++)
105113
}114
}115
116for(int i=1;i<=n;i++)
117125
}126
}127
int ans=0
;128
intt;
129while
(bfs())
130135
}136 printf("
%d\n
",ans);
137}
138return0;
139 }
dining是每種食物和飲料只能分配給乙個人。所以可以把容量看成1. 可以看成是一樣的題目。 dinic() 0ms;
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include7 #include 8 #include
9 #include 10 #include 11 #include 12 #include 13 #include 14
using
namespace
std;
15 typedef long
long
ll;16
const
int inf = 0x4fffffff;17
const
double exp = 1e-5;18
const
int ms = 805;19
const
int size = 200005;20
2122
struct
edge
23edges[size];
2627
inthead[ms];
28int
level[ms];
29int
que[ms];
30int
qs,qe,cnt;
31int
n,f,d;
32int
src,des;
3334
void add(int u,int v,int
w)35
3940
intbfs()
4157}58
}59return level[des]>0;60
}6162int dfs(int u,int
minv)
6376
}77 level[u]=-1; //
從u出發無法找到argument
78return0;
79}8081
82int
main()
83107
for(int j=1;j<=dsum;j++)
108112
}113
int ans=0
;114
while
(bfs())
115120
}121 printf("
%d\n
",ans);
122}
123return0;
124 }
成都賽區網路賽 hdu 4292 food
題目 給出n個人喜歡的飲料種類以及食物種類,每個人只能取其中一種且數量為1,現在給出有f中食物以及d種飲料,以及他們各自的數量,問如何安 排食物以及飲料,使得最多的人得到乙個食物以及一瓶飲料 題目類似poj3281 dining 只是那題目每個種類都只有數量1 所以這道題目就只用才起點建邊和終點建邊...
hdu 4292 Food 拆點網路流
解法 拆人 include include include include include include include include include include include include include include include include include include ...
HDU 4292Food 最大流 拆點
題意就是每個人都有喜歡的飲料和食物,但是這些飲料和食物有限,問你如何選才能使最多的人喝到自己喜歡的飲料和食物。這題主要就是想清楚如何建邊,然後跑乙個最大流就好了 分別建立 源點指向飲料的邊 飲料指向人的邊 人指向自己的邊 保證每個人只被走一次 人指向食物的邊,食物指向匯點的邊。這裡要把人的點拆成兩個...