攜程的一道圖論題
題意:給出一張無向圖 每條邊有乙個長度和 刪除該邊的權值 再給出起點和終點 求從起點到終點的最短路增加 要刪除的邊的最小的權值和。
【思路】要使 從起點到終點的最短路長度增加 就要把該最短路破壞掉 從起點到終點的最短路可能不止一條,我們可以把 這些路徑都找出來 重新構成乙個圖
再求這個圖的最小割 就是答案了 怎麼把這些路徑都找出來呢 求兩次最短路 第一次求 所有點到起點的最短路d1[x] 第二次求所有點到終點的最短 路 d2[x] 從起點到終點的最短路為ans 。再遍歷每一條邊 對於d1[u]+d2[v]+w[u][v]== ans 的邊就可以加入了~
還要改一點 先放這裡
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9#define maxx 9999999
10using
namespace
std;
1112
struct e;
13struct node;
14 vector g1[1002
];15 vector g[1002
];16 vectoredge;
17int vis[1002],d1[1002],d2[1002],n,a[1002],p[1002],num[1002],cur[1002],d[1002
];18
19void add(int
from,int to,int
c)20
3031
void bfs(int s,int
t)3251}
52}53}
5455
int zg(int s,int
t)56
66 x=t;
67while(x!=s)
6873
return
a;74}75
76int maxflow(int s,int t,int
n)77
93int ok=0;94
for(i=cur[x];i)
95108
}109
if(ok==0
)110
119if(--num[d[x]]==0) break
;120 num[d[x]=m+1]++;
121 cur[x]=0;///
/!@#$%^^&
122if(x!=s)
123 x=edge[p[x]].from
;124
125}
126}
127return
flow;
128}
129130
131int spfa1(int s,int
t)132
156}
157}
158}
159return
d1[t];
160}
161int spfa2(int s,int
t)162
186}
187}
188}
189return
d2[t];
190}
191192
193int
main()
194206
edge.clear();
207while(m--)
208217
intans;
218 ans=spfa1(s,t);
219spfa2(t,s);
220//
printf("chang %d\n",ans);
221for(int i=1;i<=n;i++) //
構圖 求最大流
222for(int j=0;j)
223232
}233
//printf("***");
234//
printf("st %d %d\n",s,t);
235 printf("
ans %d\n
",maxflow(s,t,n));
236}
237return0;
238 }
攜程程式設計大賽決賽 1004 最短路徑的代價
這個題題意就不用說了,想了半天。思路就是把所有的最短路徑邊求出來,然後再以刪掉該邊的花費作為代價建圖,設立源點和匯點,求最大流即可。include include include includeusing namespace std const int maxn 2000 const int max...
有代價的單源最短路徑
問題 有代價的單源最短路徑,並要求儲存路徑。求最短的路徑,並使代價最小 特點 儲存路徑 決定了難以用dijkstra,可以用flody,用path i j 表示 i 想走到 j 邁出的第一步。假設k是 i j 的中間節點,更新時候用path i j path i k 具體做法見link。但是flod...
dp演算法之有代價的最短路徑
題目 有代價的最短路徑 題目介紹 如下圖所示,現在平面上有n個點,此時n 7,每個點可能和其他點相連,相連的線有一定權值,求出從0點到n 1點的消耗權值的最小值。分析 用動態規劃的思路來解決,每一點與其他點的消耗權值的最小值都儲存在乙個二維陣列中,下乙個點消耗的最小值可以根據前乙個點來得出。如果兩個...