城市重建 網路流

2021-07-09 09:40:54 字數 1555 閱讀 8389

題意一開始不是很好理解,然後考試的時候就把它跳過了。。

題意:有m年,n個城市,每年最多修建k個城市。然後會發生一系列的事件,包括拆一條邊,加一條邊,對x所在的連通塊中的城市進行重修。每個城市最多重修一次,求最多有多少城市可以被重修,然後輸出每乙個發生重修事件的年份實際修了多少城市,要求字典序最小。n,m都在幾百左右。

其實就是按著他的步驟模擬一下,如果遇到可修的年份,就向連通塊裡面全部連上邊。但是要注意,同乙個年份可以被用k次,所以如果用匈牙利匹配的話需要將乙個年份拆成k個,然後倒序匹配。如果用網路流的話,就不需要拆點了,直接把流量上調就行了,但是網路流不好控制字典序,乙個比較暴力的做法就是強行給邊上設費用,讓編號小的邊費用更大。

#include#include#include#includeusing namespace std;

#define rep(i,a,b) for(int i=a;i<=b;++i)

#define ll long long

#define clr(a) memset(a,0,sizeof a)

const int inf = 0x3f3f3f3f;

const int maxn = 1005;

const int maxm = 500000;

int n, m, k;

struct ed ;

struct flownet

int dis[maxn];

bool vis[maxn];

int vn, s, t, tot, flow;

inline void adde(int a, int b, int c, int d)

void init(int n, int s, int t)

bool update()

int aug(int u, int augco)

vis[u] = 1;

int delta, augc = augco;

for (ed*p = adj[u]; p && augc; p=p->nxt)

}return augco - augc;

} int mcmf()

while (update());

return tot;

} void calc(int *ans, int yeah)

void debug()

} g;

bool way[maxn][maxn];

int scc[maxn], cnt, yeah;

bool vis[maxn];

int ans[maxn];

void dfs(int u)

int main()

} rep(i, 1, n) g.adde(m+i, g.t, 1, 0);

g.mcmf();

printf("%d\n", g.flow);

g.calc(ans, yeah);

rep(i, 1, yeah)

printf("%d%c", ans[i], i==yeah?'\n':' ');

} return 0;

}

hdu5352城市重建 (km,最大流,費用流)

題意 略 題解 一道將自己隱藏得很好的匹配問題,直接說建圖方法吧 按照網路流的方式敘述的,想寫km的可以自行轉換 對於n座城市,每座城市都看做乙個點,並直接與源點相連,容量為1,對於操作1,將其看做乙個點,將此時在聯通 塊中的點均與其相連,容量為1,然後再將其與匯點相連,容量為k km的話,這裡就需...

R seau Donn e 搭建網路

reseu donnnee這門基本處於學一回忘一回的階段,這次,趁還沒忘利索之前,趕緊寫下來,為以後用著的時候存著。網路的組成 client1 communateur routeur1 routeaur2 communateur client2 配置ip 1.sudo ifconfig eth0 1...

搭建網路源

搭建本地源 1.mount o loop home centos 7 x86 64 everything 1708.iso mnt sr0 掛載檔案到mnt下的sr0,如果沒有sr0可以自己建乙個 2.lsblk可以檢視到掛載的資訊 3.vi etc yum.repos.d centos base....