HDU5352 MZL s City 最小費用流

2021-08-15 14:13:26 字數 1763 閱讀 3214

/**

題意:乙個國家有n個城市,該國家經常發生**,**之後可能毀壞城市,城市可能也會重建,重建之後城市不再會被毀壞,

一年之內最多重建k個城市,現在知道有m年的事件,有三種:

1. 重建與x能通過道路直接或者間接連線到的城市

2. 城市x和城市y之間連線一條道路

3. 發生**,**毀壞p條道路,道路連線的沒有重建的城市會被毀壞

問你m年之後最多建立的多少個城市,還需要輸出每個1操作在當時重建的城市數量,要求字典序最小

思路:根據題目知道每個城市重建一次就行了(也可以說是最多一次),找出每個城市可修建的時間,又由於每年建立城市的

數量最多為k,如果只求最大數量的話就容易想到乙個網路流的演算法:源點和每座城市之間連邊,容量為1,城市和可以修建

的年份連邊,容量為1,年份和匯點連邊,容量為k,這樣求一遍最大流即為答案,沒有要求字典序的話那麼年份和匯點的邊

的流量就是該年份所建造的城市的數量。但是要使1操作的字典序最小,那麼就在年份和匯點的邊之間加個費用,年份越大費用越

小,這樣求一遍最小費用流即可。

*/#includeconst int maxn = 500 + 10;

const int inf = 1e9;

using namespace std;

struct p

p(int f, int t, int ca, int fl, int c, int i)

};vectoredge;

vectorg[maxn];

int kase = 1, s, t, n, m, t, k;

int inq[maxn], d[maxn];

int p[maxn], a[maxn];

int flow, cost, vis[maxn];

vectorcan_arrive[maxn];

setto[maxn];

int ans[maxn * 2];

void add(int f, int t, int c, int co, int day)

bool bellmanford(int s, int t, int &flow, int &cost)

}if(d[t] == inf) return false;

flow += a[t]; cost += d[t] * a[t];

for(int u = t; u != s; u = edge[p[u]].from)

return true;

}int mincost(int s, int t)

void bfs(int day, int x)

}}int main()

int cnt = n + 1;

for(int i = 1; i <= m; i++) else if(op == 2) else }}

int s = 0, t = cnt;

for(int i = 1; i <= n; i++) add(s, i, 1, 0, -1);

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

add(i, cnt, k, 700 - id, id);

}int tt = mincost(s, t);

cout << tt << endl;

for(int i = 0; i < edge.size(); i++)

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

}return 0;

}

hdu 4411 最小費用流

思路 這道題建圖比較難想,首先是建立超級源點和超級匯點,那麼由於有k個警察,於是vs與0連邊,容量為k,費用為0,因為這k個警察不一定都出去,也就是不一定是最大流,於是0和vt連邊,容量為k,費用為0。然後就是拆點建圖了 1 0到i連邊,容量為1,費用0到i的最短路,表示去抓城市i的小偷。2 從i到...

hdu 4411 最小費用流

思路 這道題建圖比較難想,首先是建立超級源點和超級匯點,那麼由於有k個警察,於是vs與0連邊,容量為k,費用為0,因為這k個警察不一定都出去,也就是不一定是最大流,於是0和vt連邊,容量為k,費用為0。然後就是拆點建圖了 1 0到i連邊,容量為1,費用0到i的最短路,表示去抓城市i的小偷。2 從i到...

hdu 1533 Going Home 最小費用流

建圖很簡單 bfs預處理地圖,距離就為費用 源點到所有m建邊,流量1費用0 m到所有h建邊,流量1費用為距離 h到所有匯點建邊,流量1費用0 include include include includeusing namespace std define maxn 10005 define max...