HDU 4292 Food 多源多匯入門題

2022-04-17 08:21:21 字數 4459 閱讀 6732

food

有f種食物和d種飲料,每種食物或飲料只能供有限次,且每個人只享用一種食物和一種飲料。現在有n個人,每個人都有自己喜歡的食物種類列表和飲料種類列表,問最多能使幾個人同時享用到自己喜歡的食物和飲料。

鄰接矩陣 dinic    在定點數較多的時候比較慢。time  608 ms   。鄰接表可以加速

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 

7 #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 #include 

7 #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 #include 

7 #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 最大流 拆點

題意就是每個人都有喜歡的飲料和食物,但是這些飲料和食物有限,問你如何選才能使最多的人喝到自己喜歡的飲料和食物。這題主要就是想清楚如何建邊,然後跑乙個最大流就好了 分別建立 源點指向飲料的邊 飲料指向人的邊 人指向自己的邊 保證每個人只被走一次 人指向食物的邊,食物指向匯點的邊。這裡要把人的點拆成兩個...