題目來源: CodeForces基準時間限制:1 秒 空間限制:131072 KB 分值: 160 難度:6級算法題
收藏
關注在某個國家有n個城市,他們通過m條無向的道路相連。每個城市有一支軍隊。第i個城市的軍隊有ai個士兵。現在士兵開始移動。每個士兵可以呆在原地,或者走到和他所在城市直接相鄰的城市,即設每一條邊長度為1的話,他離開之后不能距離原來城市大于1。
判斷移動之后,能不能使得第i個城市恰好有bi個士兵。
Input單組測試數據。第一行有兩個整數n和m(1 ≤ n ≤ 100, 0 ≤ m ≤ 200)。第二行包含n個整數 a1, a2, ..., an (0 ≤ ai ≤ 100)。第三行包含n個整數b1, b2, ..., bn (0 ≤ bi ≤ 100)。接下來m行,每行給出兩個整數 p 和q (1 ≤ p, q ≤ n, p ≠ q),表示p和q之間有一條無向的道路。每兩個城市之間最多有一條無向的道路。Output如果能夠調整成功,輸出YES,否則輸出NO。Input示例4 41 2 6 33 5 3 11 22 33 44 2Output示例YES構造源點和匯點----然后直接最大流救過了--------------沒有考慮只能到相鄰點--------數據有點弱
代碼:
#include<cstdio>#include<vector>#include<cstring>#include<algorithm>using namespace std;struct node{int to,cost,cap,ffv;}OP;vector<node>V[120];int n,m,dist[110],PRe1[110],pre2[110],aa[110];void add_edge(int a,int b,int c){ OP.to=b;OP.cost=1;OP.cap=c;OP.ffv=V[b].size(); V[a].push_back(OP); OP.to=a;OP.cost=-1;OP.cap=0;OP.ffv=V[a].size()-1; V[b].push_back(OP);}bool tyuyi(int s,int t,int F){ int INF=55555; while (F) { fill(dist,dist+n+1,INF); fill(pre1,pre1+n+1,-1); fill(pre2,pre2+n+1,-1); dist[s]=0; bool update=true; while (update) { update=false; for (int i=1;i<=n;i++) { if (dist[i]==INF) continue; for (int j=0;j<V[i].size();j++) { if (V[i][j].cap>0&&dist[i]+V[i][j].cost<dist[V[i][j].to]) { update=true; dist[V[i][j].to]=dist[i]+V[i][j].cost; pre1[V[i][j].to]=i;pre2[V[i][j].to]=j; } } } } if (dist[t]==INF) return false; F--;int k=t,h; while (pre1[k]!=-1) { h=pre2[k]; k=pre1[k]; V[k][h].cap--; V[V[k][h].to][V[k][h].ffv].cap++; } } return true;}int main(){ int a,b,c,s1,s2; scanf("%d%d",&n,&m); s1=s2=0; for (int i=1;i<=n;i++) { scanf("%d",&c); s1+=c; aa[i]=c; add_edge(n+1,i,c); } for (int i=1;i<=n;i++) { scanf("%d",&c); s2+=c; add_edge(i,n+2,c); } while (m--) { scanf("%d%d",&a,&b); add_edge(a,b,aa[a]); add_edge(b,a,aa[b]); } n+=2; if (s1!=s2) { printf("NO/n"); return 0; } bool fafe=tyuyi(n-1,n,s1); if (fafe) printf("YES/n"); else printf("NO/n"); return 0;}
新聞熱點
疑難解答