P4382 八省聯考 2018 劈配

2022-10-09 01:15:16 字數 1650 閱讀 1831

題面自己看吧、

std對於第一問,容易想到是二分圖匹配。

具體模型:

對於第二問,可以列舉這個學生要前進多少名。

假設當前學生 \(i\) 前進 \(x\) 名。

那麼把學生 \(i\) 的可以使他不沮喪的所有志願的所有邊連上。

再把前 \(i - x - 1\) 名學生滿足第一問中的志願的邊連上。

判斷是否滿流即可。

總結:動態加邊網路流。

#include using namespace std;

namespace fread

return *s++;

}}namespace fwrite

inline void putchar(char c)

struct ntr

} ztr;

}#ifdef online_judge

#define getchar fread::getchar

#define putchar fwrite::putchar

#endif

inline int read()

while(c >= '0' && c <= '9')

return x * f;

}inline void write(int x)

if(x > 9)

write(x / 10);

putchar(x % 10 + '0');

}typedef int tp;

const int _ = 3e3 + 10;

int n, m, s, t, lv[_], cur[_];

int tot = 1, head[_], mcp[_], to[_ << 1], nxt[_ << 1];

tp w[_ << 1];

inline void add(int u, int v, tp dis)

inline void add(int u, int v, tp dis)

inline bool bfs()

}return lv[t] != -1;

}tp dfs(int p = s, tp flow = 2e9)

}return flow - rmn;

}inline tp dinic()

int a[207][207], b[_], sv[_], a[_], tv[_], f[_];

inline void init()

signed main()

else

}a[i] = fl, tv[i] = id;

memcpy(mcp, head, sizeof head);

} for(int i = 1; i <= n; ++i)

write(tv[i]), putchar(' ');

putchar('\n');

for(int i = 1; i <= n; ++i)

for(int j = 1; j < i; ++j)

}} for(int i = 1; i <= n; ++i)

write(f[i]), putchar(' ');

putchar('\n');

memset(f, 0, sizeof f);

} return 0;

}

洛谷4382 八省聯考2018 劈配

省選滾粗回家。滿懷信心的day2t1網路流。乙個半小時自信過樣例。然後就回家了。首先能很快的看出這是乙個網路流。第一問 我們考慮匹配,按順序列舉人,再按順序列舉優先順序,每次在前乙個優先順序的殘餘網路上加邊,跑最大流,若流量是1,則說明這是他的理論可能的最高優先順序,去做下乙個人,否則繼續列舉優先順...

八省聯考2018 劈配

題目這題目,乍一眼看上去像乙個dp,因為這個資料範圍一般都是dp,但是考慮到轉移有後效性,所以顯然是做不了dp的。考試的時候像著怎麼設狀態沒有後效性,失敗了,就只打了乙個70分的暴力,還掛了20分。這題其實是個 網路流 匹配 真心看不出,然後我寫部落格的時候旁邊yl神犇看見了,嘲諷了我一波,我是真的...

八省聯考2018 劈配

題解 這題思路就是暴力。主要在於分析複雜度?dinic跑二分圖 msqrt n 這題好像用不到。首先這是個匹配問題顯然需要利用網路流 考慮第一問 每一次我們就暴力按照志願順序加入邊 直到二分圖匹配數 1 這個複雜度是 nm nm 的 因為一次只增廣一條邊所以每次是nm的,不過這個很明顯是跑不滿而且差...