2019杭電多校暑假訓練 第一場

2021-09-25 20:48:00 字數 1646 閱讀 6281

題目大意:

一張圖里有n個節點,m條邊,要讓我們去割掉一些邊,讓從1到n的距離增大。

解題思路:

首先跑一遍從1 - n 的最短路,然後得到d1陣列,然後根據性質:d[v] == d[u] + w[i], 這個性質得到最短路的邊,然後重新構建乙個最短路徑的圖,然後再求這張新圖的最小割。

ac**:

#include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairpii;

const int maxn = 1e5 + 5;

const int inf = 0x3f3f3f3f3f3f3f3f;

int n, m, s, t;

int h[maxn], e[maxn * 2], ne[maxn * 2], idx;

int d[maxn];

ll d1[maxn], w[maxn * 2];

ll ans, maxflow;

bool vis[maxn];

//構圖

int ncu_x[maxn], ncu_y[maxn];

ll ncu_w[maxn];

int permt;

int h1[maxn], e1[maxn * 2], ne1[maxn * 2], idx1;

ll w1[maxn * 2];

inline void add(int a, int b, int c)

inline void add1(int a, int b, ll c)

inline void dijkstra(void) );

while(q.size()) );

}} }

}inline bool bfs(void)

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

return true;

}inline ll dinic(int u, ll flow) else d[v] = 0;

} }return 0;

}int main(void)

//找最短路

dijkstra();

if(d1[n] == inf) printf("0\n");

else

//找到最小割

s = 1, t = n;

ll flow;

maxflow = 0;

while(bfs())

while(flow = dinic(1, inf)) maxflow += flow;

printf("%lld\n", maxflow);

} }fclose(stdin);

return 0;

}

注意點:

1.注意陣列的大小不要開小了

2.當我們重新構圖的時候可以重新開闢新的陣列空間進行重新構圖,沒有必要去重新初始化原圖(我最開始是重新初始化原圖,怎麼改也改不對)

3. == 不要寫成了 = !!!(坑了我幾個小時,在這個地方)

4. == 不要寫成了 = !!!(坑了我幾個小時,在這個地方)

5. == 不要寫成了 = !!!(坑了我幾個小時,在這個地方)

2019杭電多校第一場

dp i j k t dp i j k t dp i j k t 表示0 1 2,3 0,1,2,3 0,1,2,3出現的位置排序後為i,j k,t i,j,k,t i,j,k,t的方案數 列舉第t 1 t 1t 1位的情況進行轉移 對於限制情況,固定右端點,暴力列舉所有狀態,把所有非法狀態清零 i...

2019 杭電多校(第一場)

題目 1002 operation 線性基 題意給你n個數 兩個操作,查詢l r區間異或最大值 在陣列最後麵加一數 思路維護兩個陣列 1 b i j 儲存a 1 到a i 之間的第j位線性基。2 pos i j 儲存最大的l a l 使得b i j 有值。對於每一次詢問 l,r 如果pos r j ...

2019杭電多校第一場

從右到左分別為0 n輛車,每輛車有長度l,起始位置s和速度v,0座標在左邊,不能超車,單車道,問0號車到達0座標的最短時間。最短時間考慮二分時間,然後按這個時間從左邊第一輛車開始依次計算最終位置,最後判斷0號車的位置即可。include using namespace std const int n...