題意一開始不是很好理解,然後考試的時候就把它跳過了。。
題意:有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....