唔這道題。。最大流的這種寫法我實在不習慣,**基本看懂了但是我寫不出來,希望以後有一天可以寫出來
題意: 有 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...