題目大意:
一張圖里有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...