h3416最大流(未解決)

2021-07-31 03:06:06 字數 1520 閱讀 1244

唔這道題。。最大流的這種寫法我實在不習慣,**基本看懂了但是我寫不出來,希望以後有一天可以寫出來

題意: 有 n 個城市,知道了起點和終點,有 m 條有向邊,問從起點到終點的最短路一共有多少條。

分析: 求最短路的條數可以用最大流,不過要是去掉原圖中不在最短路上的邊,

判斷某條邊是不是最短路上的邊的時候,如果滿足

d1[from]  + d2[to] + edge[i].w = dis[en]

則可以說明該邊是最短路上的邊,其中 d1  為各點到起點的最短距離,d2 為各點到終點的最短距離

侵刪 #include

#include

#include

#include

#include

using namespace std;

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

#define min(a,b)(a)<(b)?(a):(b)

const int inf=int_max;

const int maxn=1005;

const int maxm=1000000;

struct node

e[maxm];

int tot;

int head[maxn];

void add(int s,int u,int f1,int f2)

int q[maxn];

int cnt[maxn];

int d[maxn];

int low[maxn];

int cur[maxn];

int maxflow(int s,int t,int n)

cnt[n]=n-1;

cnt[0]++;

d[t]=0;

*rear++=t;

while(front0)}}

int flow=0, u=s, top=0;

low[0]=inf;

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

cur[i]=head[i];

while(d[s]0&&d[u]==d[e[i].to]+1)

}if(i!=-1)

flow+=minf;

u=s;

low[0]=inf;

top=0;}}

else}}

}int main()

scanf("%d %d",&st,&en);

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

d2[i] = d1[i] = inf;

dijkstra(st,d1,head2,edge,tt);

dijkstra(en,d2,head3,ee,t3);

memset(head,-1,sizeof(head));

tot = 0;

for(i = 1; i < tt; i++)

int res = maxflow(st,en,n);

printf("%d\n",res);

}return 0;

}

h3572最大流(未解決)

自己寫的超時了,才知道要用二分最大流,然而二分最大流是什麼。未完待續 唔我還是放棄了,這個其實是一道二分的最大匹配題,以我現在對圖的熟練度。網上講二分的全是匈牙利演算法,我還是先學最大流吧 這個放一放 未完待續 include include include include using namesp...

hdu3416 最短路 最大流

最短路 最大流 用spfa算出 s到各個點的最短路 t到各個點的最短路 if dis1 i dis2 i map i j dis1 t 滿足這種情況說明邊在最短路上,所以根據這個方法建邊 然後最大流解決 這道題很值得體會體會 this code is made by linmeichen probl...

HDU3416 最短路 最大流

題意 有向圖求沒有交集的a到b最短路的數量 很顯然要先將所有最短路上的邊取出來。用正向跑一遍dis1,反向跑一遍dis2的方法 dis1 u dis2 v w dis1 b 的邊就是最短路上的邊 但是要求沒有交集的最短路,想到最大流,每一條最短路上的邊都看作一條流量為1的邊,直接跑最大流即可。inc...