題面自己看吧、
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的,不過這個很明顯是跑不滿而且差...