日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法竞赛入门经典 写题笔记(第五章 图论算法与模型2)

發布時間:2024/10/12 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法竞赛入门经典 写题笔记(第五章 图论算法与模型2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節內容——

  • 2-SAT
  • dijstra算法的一些應用
  • SPFA算法的一些應用

例題9 飛機調度

有n架飛機需要著陸。每架飛機都可以選擇“早著陸"和”晚著陸“兩種方式之一,且必須選擇一種。第i架飛機的早著陸時間為\(E_i\),晚著陸時間為\(L_I\),不得在其他時間著陸。現在需要安排這些飛機的著陸方式,使得整個著陸計劃盡量安全。換句話說,如果把所有飛機的實際著陸時間按照從早到晚的順序排列,相鄰兩個著陸時間間隔的最小值(成為安全間隔)盡量大。

也就是二分這個時間,然后判斷該2-SAT是否有解。(因為這個間隔時間越小就也可能有合法解,反之越不可能,所以可以二分答案)
構圖的時候,如果兩個決策(比如說\(i_l,j_l\))間隔小于二分的答案,我們就給\(i_l,j_r\)\(i_r,j_l\)連有向邊。
然后跑tarjan判斷就行了,如果同一個飛機的兩個決策在一個強聯通分量里面,就沒有合法解了。
順便一提,劉汝佳書上寫的那個做法復雜度是假的qwq

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define MAXN 4010 #define INF 0x3f3f3f3f using namespace std; int n,m,t,tot,cnt,top; int head[MAXN],dfn[MAXN],low[MAXN],in[MAXN],st[MAXN],c[MAXN]; struct Edge{int nxt,to;}edge[MAXN*MAXN]; struct Node{int l,r;}node[MAXN]; inline void add(int from,int to){edge[++t].nxt=head[from],edge[t].to=to,head[from]=t;} inline void tarjan(int x) {dfn[x]=low[x]=++tot;in[x]=1;st[++top]=x;for(int i=head[x];i;i=edge[i].nxt){int v=edge[i].to;if(!dfn[v]) tarjan(v),low[x]=min(low[x],low[v]);else if(in[v]) low[x]=min(low[x],dfn[v]);}if(dfn[x]==low[x]){int v;++cnt;do{v=st[top--],c[v]=cnt,in[v]=0;}while(x!=v);} } inline bool check(int x) {memset(head,0,sizeof(head));t=tot=top=cnt=0;for(int i=1;i<=(n>>1);i++)for(int j=1;j<=(n>>1);j++){if(i==j) continue;int a=abs(node[i].l-node[j].l);int b=abs(node[i].l-node[j].r);int c=abs(node[i].r-node[j].l);int d=abs(node[i].r-node[j].r);if(a<x) add(i*2-1,j*2);if(b<x) add(i*2-1,j*2-1);if(c<x) add(i*2,j*2);if(d<x) add(i*2,j*2-1);}memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(in,0,sizeof(in));for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);for(int i=1;i<n;i+=2)if(c[i]==c[i+1])return false;return true; } int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifwhile(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++) scanf("%d%d",&node[i].l,&node[i].r);n<<=1;int l=0,r=INF,ans=0;while(l<=r){int mid=(l+r)>>1;if(check(mid)) ans=mid,l=mid+1;else r=mid-1;}printf("%d\n",ans);}return 0; }

例題10 宇航員分組

有A,B,C三種任務要分配給n個宇航員,其中每個宇航員恰好要分配一個任務。設所有n個宇航員的平均年齡為x,只有年齡大于或等于x的宇航員才能分配任務A;只有年齡嚴格小于x的宇航員才能分配任務B,而任務C沒有限制。有m對宇航員相互討厭,因此不能分配到統一任務。現在需要找出一個滿足上訴所有要求的任務分配方案。

3-SAT???不可能的。我們只要處理一下年齡,對于每個宇航員,照樣是2-SAT.
然后就......和上面那題一樣做就行了啊??
但是為什么會RE啊......搞不懂......先把代碼貼上,回來找鍋(咕咕咕)

#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define MAXN 100010 using namespace std; int n,m,all,kkk,cnt,tot,top,t; int head[MAXN],done[MAXN]; int dfn[MAXN],low[MAXN],in[MAXN],st[MAXN],c[MAXN]; char op[MAXN]; struct Node{int l,r,age;}node[MAXN]; struct Edge{int nxt,to;}edge[MAXN<<1]; struct Line{int u,v;}line[MAXN<<1]; inline void add(int from,int to){edge[++t].nxt=head[from],edge[t].to=to,head[from]=t;} inline void tarjan(int x) {low[x]=dfn[x]=++tot;for(int i=head[x];i;i=edge[i].nxt){int v=edge[i].to;if(!dfn[v]) tarjan(v),low[x]=min(low[x],low[v]);else if(in[v]) low[x]=min(low[x],dfn[v]);}if(low[x]==dfn[x]){int v;++cnt;do{v=st[top--];in[v]=0;c[v]=++cnt;}while(x!=v);} } inline bool check() {memset(head,0,sizeof(head));memset(in,0,sizeof(in));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));top=tot=t=cnt=0;for(int i=1;i<=m;i++){int u=line[i].u,v=line[i].v;if(node[u].age^node[v].age) {add(node[u].r,node[v].l),printf("%d %d\n",node[u].r,node[v].l);add(node[v].r,node[u].l),printf("%d %d\n",node[v].r,node[u].l);}else{add(node[u].l,node[v].r),printf("%d %d\n",node[u].l,node[v].r);add(node[u].r,node[v].l),printf("%d %d\n",node[u].r,node[v].l);add(node[v].l,node[u].r),printf("%d %d\n",node[v].l,node[u].r);add(node[v].r,node[u].l),printf("%d %d\n",node[v].r,node[u].l);}}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i),cout<<i<<endl;for(int i=1;i<=n;i++)if(c[node[i].l]==c[node[i].r]&&c[node[i].l]!=0)return false;return true; } inline bool solve(int x,int c) {done[x]=c,done[x^1]=3-c;printf("done[%d]=%d done[%d]=%d\n",x,done[x],x^1,done[x^1]);cout<<endl;for(int i=head[x];i;i=edge[i].nxt){int v=edge[i].to;if(done[v]&&done[v]==c) return false; else if(!done[v]) solve(v,c);}return true; } inline void print() {cout<<"yes"<<endl;for(int i=1;i<=n;i++){if(done[node[i].l]==1) printf("%c\n",op[node[i].l]);else if(done[node[i].l]==0&&done[node[i].r]==0) printf("%c\n",op[node[i].l]);} } int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifwhile(scanf("%d%d",&n,&m)==2){if(n==0&&m==0) break;memset(head,0,sizeof(head));top=tot=t=cnt=all=0;for(int i=1;i<=n;i++) scanf("%d",&node[i].age),all+=node[i].age;all/=n;for(int i=1;i<=n;i++){if(node[i].age<all) node[i].age=0;else node[i].age=1;}for(int i=1;i<=n;i++) scanf("%d%d",&line[i].u,&line[i].v);for(int i=1;i<=n;i++) if(node[i].age==0) node[i].l=++kkk,op[kkk]='B',node[i].r=++kkk,op[kkk]='C';else node[i].l=++kkk,op[kkk]='A',node[i].r=++kkk,op[kkk]='C';for(int i=1;i<=n;i++)printf("%c %c\n",op[node[i].l],op[node[i].r]);if(check()==false) {printf("No solution.\n");continue;}memset(done,0,sizeof(done));bool flag=true;for(int i=1;i<=n;i++)if(!done[i])if(solve(node[i].l,1))flag=false;if(flag==true) {print();continue;}memset(done,0,sizeof(done));flag=true;for(int i=1;i<=n;i++)if(!done[i])solve(node[i].r,1);print();}return 0; }

例題11 機場快線

機場快線分為經濟線和商業線兩種,線路、速度和價錢都不同。現在你有一張商業線的車票,可以坐一站商業線,而其他時候只能乘坐經濟線。假設換成時間忽略不計,你的任務是找一條取機場最快的線路,然后輸出方案。(保證最優解唯一)

因為商業線只能坐一站,而且數據范圍在1000以內,所以我們可以枚舉坐的是哪一站。
假設我們用商業線車票從車站a坐到b,則從起點到a,從b到終點這兩部分的路線對于只存在經濟線的圖中一定是最短路。所以我們只需要從起點、終點開始做兩次最短路,記錄下從起點到每個點x的最短時間\(f(x)\)和它到終點的最短時間\(g(x)\),那么總時間就是\(f(a)+time(a,b)+g(b)\)

#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> #define Max(a,b) ((a)>(b)?(a):(b)) #define Min(a,b) ((a)<(b)?(a):(b)) using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int mod = 1000000000 + 7; const int INF = 1000000000; const int maxn = 500 + 10; int T,n,m,S,d1[maxn], p1[maxn], d2[maxn], p2[maxn], vis[maxn], ok, dist; struct node {int u, val;node(int u=0, int val=0):u(u), val(val) {}bool operator < (const node& rhs) const {return val > rhs.val;} }; void print(int root, int p[], int id, int S) {vector<int> ans;while(root != S) {ans.push_back(root);root = p[root];}ans.push_back(root);int len = ans.size();if(id == 1) for(int i=len-1;i>=0;i--) {if(i != len-1) printf(" ");printf("%d",ans[i]);}else for(int i=0;i<len;i++) {if(i != 0) printf(" ");printf("%d",ans[i]);} } vector<node> g[maxn]; void BFS(int haha, int d[], int p[]) {priority_queue<node> q;q.push(node(haha, 0));for(int i=1;i<=n;i++) {d[i] = INF;}d[haha] = 0;memset(vis, false, sizeof(vis));while(!q.empty()) {node u = q.top(); q.pop();if(vis[u.u]) continue;vis[u.u] = true;int len = g[u.u].size();for(int i=0;i<len;i++) {node v = g[u.u][i];if(d[v.u] > d[u.u] + v.val) {d[v.u] = d[u.u] + v.val;p[v.u] = u.u;q.push(node(v.u, d[v.u]));}}} } int a,b,c,kase=0; int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifwhile(~scanf("%d%d%d",&n,&S,&T)) {scanf("%d",&m);for(int i=1;i<=n;i++) g[i].clear();while(m--) {scanf("%d%d%d",&a,&b,&c);g[a].push_back(node(b, c));g[b].push_back(node(a, c));}scanf("%d",&m);ok = -1;BFS(S, d1, p1);BFS(T, d2, p2);int s = -1,t = -1,ans = d1[T], res = 0;for(int i=0;i<m;i++) {scanf("%d%d%d",&a,&b,&c);if(cur < ans) {ans = cur;s = b; t = a;}}if(kase) printf("\n");else ++kase;if(s > 0) {print(s, p1, 1, S); printf(" ");print(t, p2, 2, T); printf("\n");printf("%d\n",s);}else {print(T, p1, 1, S); printf("\n");printf("Ticket Not Used\n");}printf("%d\n",ans);}return 0; }

書上還提到了dij算法的路徑統計,在這里就簡單說一下吧
枚舉兩點之間的所有最短路:先求出所有點到目標點的最短路長度\(d[i]\),然后從起點開始出發,只沿著\(d[i]=d[j]+dist(i,j)\)的邊走。
兩點之間的最短路計數:令\(f[i]\)表示從i到目標點的最短路的條數,則\(f[i]=\sum f[j] | d[i]=d[j]+dist(i,j)\)(這里書上寫錯了)

例題12 林中漫步

對于一張圖,只沿著滿足如下條件的道路(A,B)走:存在一條從B出發回家的路徑,比所有從A出發回家的路徑都短。問不同的回家路徑條數。

先跑完以家為源點的最短路,然后如果一個點a的最短路比b的小,那么連邊,這就是一個DAG了,然后再DP計個數就行了。

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #define MAXN 100010 using namespace std; int n,m,t; int head[MAXN<<1],done[MAXN],dis[MAXN],dp[MAXN]; struct Node { int u,d;friend bool operator < (Node x,Node y){return x.d>y.d;} }; struct Edge{int nxt,to,dis;}edge[MAXN<<1]; struct Line{int u,v,w;}line[MAXN<<1]; inline void add(int from,int to,int dis) {edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,head[from]=t; } inline void dij(int x) {priority_queue<Node>q;memset(done,0,sizeof(done));memset(dis,0x3f,sizeof(dis));q.push((Node){x,0});dis[x]=0;while(!q.empty()){int u=q.top().u;q.pop();if(done[u]) continue;done[u]=1;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(dis[v]>dis[u]+edge[i].dis)dis[v]=dis[u]+edge[i].dis,q.push((Node){v,dis[v]});}} } inline int solve(int x) {if(x==2) return dp[x]=1;int cur_ans=0;for(int i=head[x];i;i=edge[i].nxt){int v=edge[i].to;if(!dp[v]) dp[v]=solve(v);cur_ans+=dp[v];}return cur_ans; } int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifwhile(scanf("%d%d",&n,&m)==2&&n){memset(head,0,sizeof(head));memset(dp,0,sizeof(dp));t=0;for(int i=1;i<=m;i++){scanf("%d%d%d",&line[i].u,&line[i].v,&line[i].w);add(line[i].u,line[i].v,line[i].w);add(line[i].v,line[i].u,line[i].w);}dij(2);// for(int i=1;i<=n;i++) printf("dis[%d]=%d\n",i,dis[i]);memset(head,0,sizeof(head));t=0;for(int i=1;i<=m;i++){if(dis[line[i].u]>dis[line[i].v]) add(line[i].u,line[i].v,line[i].w);if(dis[line[i].v]>dis[line[i].u]) add(line[i].v,line[i].u,line[i].w);}printf("%d\n",solve(1));}return 0; }

最短路樹:用dij算法可以求出單元最短路樹,方法是在發現\(d[i]+w(i,j)<d[j]\)時除了更新\(d[j]\)之外還要設置\(p[j]=i\)。這樣,所有點就形成了一棵樹。
要從起點出發沿著最短路走到其他任意點,只需要順著樹上的邊走即可。

例題13 戰爭和物流

給出一個n個節點m條邊的無向圖(n<=100,m<=1000),每條邊上有一個正權。令c等于每對節點的最短路長度之和。要求刪除一條邊后使得新的c值c'最大。不聯通的兩點的最短路長度視為L。
在源點確定的情況下,只要最短路樹不被破壞,起點到所有點的距離都不會發生改變。換句話說,只有刪除最短路樹上的n-1條邊(中的任意條),最短路樹才需要重新計算。
這樣的話,我們對于每個源點,最多只需要求n次而不是m次最短路,時間復雜度為\(O(n^2mlogn)\)(dij算法的時間復雜度為\(O(mlogn)\)

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #define MAXN 2010 using namespace std; int n,m,l,t=1; long long ans1,ans2; int head[MAXN<<1],pre[MAXN],ex[MAXN<<1][MAXN],done[MAXN]; long long dis[MAXN],dist[MAXN]; struct Node {int u;long long d;friend bool operator < (Node x,Node y){return x.d>y.d;} }; struct Edge{int nxt,to,dis;}edge[MAXN<<1]; inline void add(int from,int to,long long dis) {edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,head[from]=t;edge[++t].nxt=head[to],edge[t].to=from,edge[t].dis=dis,head[to]=t; } inline long long dij(int x,int op) {priority_queue<Node>q;memset(dis,127,sizeof(dis));memset(done,0,sizeof(done));memset(pre,-1,sizeof(pre));q.push((Node){x,0});dis[x]=0;while(!q.empty()){int u=q.top().u;q.pop();if(done[u]) continue; for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if((i==op)||(i^1)==op) continue;if(dis[v]>dis[u]+edge[i].dis){dis[v]=dis[u]+edge[i].dis;q.push((Node){v,dis[v]});pre[v]=i;}}}for(int i=1;i<=n;i++)if(pre[i]!=-1&&op==0) ex[pre[i]][x]=ex[pre[i]^1][x]=1;long long cur_ans=0;for(int i=1;i<=n;i++){if(dis[i]<1e17) cur_ans+=dis[i];else cur_ans+=l;}return cur_ans; } int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);freopen("ce.out","w",stdout);#endifwhile(scanf("%d%d%d",&n,&m,&l)==3){memset(head,0,sizeof(head));memset(ex,0,sizeof(ex));t=1;ans1=0,ans2=0;for(int i=1;i<=m;i++){int x,y;long long w;scanf("%d%d%lld",&x,&y,&w);add(x,y,w);}for(int i=1;i<=n;i++)dist[i]=dij(i,0),ans1+=dist[i];for(int i=2;i<=t;i+=2){long long cur_ans=0;for(int j=1;j<=n;j++){if(ex[i][j]) cur_ans+=dij(j,i);else cur_ans+=dist[j];}ans2=max(ans2,cur_ans);}printf("%lld %lld\n",ans1,ans2);}return 0; }

例題14 過路費(加強版)

運送貨物需要繳納過路費。進入一個尋裝需要繳納一個單位的貨物,進入一個城鎮時,每20個單位的貨物中就要上繳1個單位(比如,攜帶70個單位的貨物進入城鎮,需要繳納4個單位的貨物)。現在給定你一張圖,請找出一條繳納過路費最少的路線,并輸出。如果有多條路線,輸出字典序最小的。

逆推的dij算法。令\(d[i]\)表示進入節點i之后,至少需要\(d[i]\)個單位的貨物,到達目的地時貨物數量才足夠。則每次選擇一個\(d[i]\)最小的未標號的節點,更新它的所有前驅節點的d值就行了。輸出路徑的時候根據d值就可以構造出字典序最小的解。

emmmm為什么我把書上的解釋全抄下來了......因為我覺得寫得確實比較清晰啊qwq

這個題我的代碼還是不知道為什么鍋了。。。先敷衍一下放個maomao的吧......

#include <bits/stdc++.h> using namespace std;#define int long longconst int N = 200 + 5; const int INF = 0x3f3f3f3f3f3f3f3f;vector <int> G[N];int n, p, kase, dis[N], done[N]; char s, t;int get_tot (int w) {int l = 0, r = 1e17;while (l < r) {int mid = (l + r) >> 1;if (mid - ceil ((1.0 * mid) / 20.0) >= w) {r = mid;} else {l = mid + 1;}}return r; }struct HeapNode {int u, d;bool operator < (HeapNode rhs) const {return d > rhs.d; } };priority_queue <HeapNode> q;void solve () {memset (done, 0, sizeof (done));memset (dis, 0x3f, sizeof (dis));dis[(int)t] = isupper (t) ? get_tot (p) : p + 1;q.push ((HeapNode) {t, dis[(int)t]});while (!q.empty ()) {HeapNode now = q.top (); q.pop ();if (done[now.u]) continue;for (int i = 0; i < (int) G[now.u].size (); ++i) {int v = G[now.u][i];int _w = isupper (v) ? get_tot (dis[now.u]) : dis[now.u] + 1;if (dis[v] > _w) {dis[v] = _w;q.push ((HeapNode) {v, dis[v]});} }done[now.u] = true; } }bool cmp (int lhs, int rhs) {return dis[lhs] == dis[rhs] ? lhs < rhs : dis[lhs] < dis[rhs]; }signed main () {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifwhile (cin >> n) {if (n == -1) break;cout << "Case " << ++kase << ":" << endl;for (int i = 0; i < N; ++i) G[i].clear ();for (int i = 1; i <= n; ++i) {static char u, v;cin >> u >> v;G[(int)u].push_back ((int)v);G[(int)v].push_back ((int)u);}cin >> p >> s >> t;solve ();int min_dis = 0x7fffffffffffffffll;for (int i = 0; i < (int)G[(int)s].size (); ++i) {int v = G[(int)s][i];min_dis = min (min_dis, dis[v]);}for (int i = 0; i < N; ++i) {if (!G[i].empty ()) {sort (G[i].begin (), G[i].end (), cmp);}}if (s == t) {cout << p << endl;cout << (char) t << endl;continue;}cout << min_dis << endl;int now = s; cout << (char) s << "-";while (now != t) {now = G[now][0];cout << (char) now; if (now != t) cout << "-";} cout << endl;} }

例題15 在環中

給定一個n個點m條邊(n<=50)的加權有向圖,求平均權值最小的回路。輸入沒有自環。

二分答案。假設存在一個包含k條邊的回路,回路上各條邊的權值為\(w_1,w_2,...,w_k\),那么平均值小于mid意味著\((w_1-mid)+(w_2-mid)+...+(w_k-mid)<0\),那么就直接給每條邊減去mid,然后用SPFA判斷一下是否有負環就行了。

注意小數二分的時候精度不要取太高......常數太大會T的.......

#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<queue> #define MAXN 110 #define eps 1e-7 using namespace std; int n,m,t,T,kase; int head[MAXN],done[MAXN],cnt[MAXN]; double dis[MAXN]; struct Line{int u,v;double w;}line[MAXN*MAXN]; struct Edge{int nxt,to;double dis;}edge[MAXN*MAXN]; inline void add(int from,int to,double dis) {edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,head[from]=t; } inline bool spfa(int x) {queue<int>q;for(int i=0;i<=n;i++) dis[i]=1e9,done[i]=cnt[i]=0;q.push(x);done[x]=1;dis[x]=0;while(!q.empty()){int u=q.front();q.pop();done[u]=0;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(dis[v]>dis[u]+edge[i].dis){dis[v]=dis[u]+edge[i].dis;if(!done[v]){done[v]=1;q.push(v);if(++cnt[v]>=n) return false; }}}}return true; } inline bool check(double x) {bool flag=false;for(int i=1;i<=n;i++)for(int j=head[i];j;j=edge[j].nxt)edge[j].dis-=x;for(int i=1;i<=n;i++)if(!spfa(i)==true) flag=true;for(int i=1;i<=n;i++)for(int j=head[i];j;j=edge[j].nxt)edge[j].dis+=x;// puts("oh no");return flag; } int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifscanf("%d",&T);while(T--){memset(head,0,sizeof(head));t=0;scanf("%d%d",&n,&m);double l=1e9,r=0.0;for(int i=1;i<=m;i++){scanf("%d%d%lf",&line[i].u,&line[i].v,&line[i].w);add(line[i].u,line[i].v,line[i].w);r=max(r,line[i].w);l=min(l,line[i].w);}printf("Case #%d: ",++kase);if(!check(r+1)) printf("No cycle found.\n");else{while(l+eps<r){double mid=(l+r)/2.0;// printf("l=%.2lf r=%.2lf mid=%.2lf\n",l,r,mid);if(check(mid)) r=mid;else l=mid;}printf("%.2lf\n",r);}}return 0; }

例題16 Halum操作

給定一個有向圖,每條邊都有一個權值。每次你可以選擇一個節點v和一個整數d,把所有以v為終點的邊的權值減小d,把所有以v為起點的邊的權值增加d,最后要讓所有邊權的最小值為正且盡量大。

因為不同的操作互不影響,所以可以按照任意順序實施這些操作。另外,對于同一個節點的多次操作也可以合并,所以我們可以令sum(u)表示作用于節點u之上的所有d之和。然后二分答案x,問題轉化成為是否可以讓所有操作完成后每條邊的權值均不小于x。對于邊a->b,操作完之后應該是\(w(a,b)+sum[a]-sum[b] \ge x\),也就是\(sum[b]-sum[a]<=w(a,b)-x\)。這樣,就是一個差分約束系統了,我們連a到b,權值為\(w(a,b)-x\)的邊。然后用負環來判斷這個差分約束系統是否有解。

對了,書上的翻譯感覺有問題。依AC代碼來看,應該是讓所有邊的最小值為正且盡量大......

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #define MAXN 510 using namespace std; int n,m,t; int head[MAXN],done[MAXN],dis[MAXN],cnt[MAXN]; struct Edge{int nxt,to,dis;}edge[3000]; struct Line{int u,v,w;}line[3000]; inline void add(int from,int to,int dis) {edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,head[from]=t; } inline bool spfa() {queue<int>q;for(int i=1;i<=n;i++)q.push(i),done[i]=1,dis[i]=0x3f3f3f3f,cnt[i]=0;while(!q.empty()){int u=q.front();q.pop();done[u]=0;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(dis[v]>dis[u]+edge[i].dis){dis[v]=dis[u]+edge[i].dis;if(!done[v]){done[v]=1;cnt[v]++;q.push(v);if(cnt[v]>=n) return false;}}}}return true; } inline bool check(int x) {bool flag=false;for(int i=1;i<=n;i++)for(int j=head[i];j;j=edge[j].nxt)edge[j].dis-=x;if(spfa()) flag=true;for(int i=1;i<=n;i++)for(int j=head[i];j;j=edge[j].nxt)edge[j].dis+=x;return flag; } int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifwhile(scanf("%d%d",&n,&m)!=EOF){memset(head,0,sizeof(head));t=0;int l=0,r=-0x3f3f3f3f,ans;for(int i=1;i<=m;i++){scanf("%d%d%d",&line[i].u,&line[i].v,&line[i].w);add(line[i].u,line[i].v,line[i].w);r=max(r,line[i].w);}if(!check(1)) {printf("No Solution\n");continue;}else if(check(r)) {printf("Infinite\n");continue;}while(l<=r) {int mid=(l+r)>>1;if(check(mid)) ans=mid,l=mid+1;else r=mid-1;}printf("%d\n",ans);}return 0; }

例題17 蒸汽式壓路機

翻譯還是去看書吧.......(反正我大概也是每次都抄一遍)
拆點的最短路,因為一個位置表示的狀態不一樣,所以我們要拆點來分別代表這些狀態
把每個點\((r,c)\)拆成8個點\((r,c,dir,double)\),分別表示上一步從上下左右的哪個方向(dir)移動到這個點,以及移動到這個點的這條邊的權值是否已經加倍(doubled)
題解也還是去看書吧.......(反正圖我也是畫不出來的......)

#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<cstdio> #include<queue> #include<vector> #define MAXN 100010 #define INF 0x3f3f3f3f using namespace std; inline int read() {int f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48); ch=getchar();}return x; } int n,R,C,r1,c1,r2,c2,kase,t; int inv[4]={2,3,0,1},dr[4]={-1,0,1,0},dc[4]={0,-1,0,1}; int grid[110][110][4],id[110][110][4][2]; int dis[MAXN],done[MAXN],head[MAXN]; const int Up=0; const int Left=1; const int Down=2; const int Right=3; struct Edge{int nxt,to,dis;}edge[20000010]; struct Node {int u,d;friend bool operator < (struct Node x,struct Node y){return x.d>y.d;} }; inline void add(int from,int to,int dis) {// printf("[%d %d] %d\n",from,to,dis);edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,head[from]=t; } inline int ID(int r,int c,int dir,int doubled) {int &x=id[r][c][dir][doubled];if(x==0) x=++n;return x; } inline bool cango(int r,int c,int dir) {if(r<1||r>R||c<1||c>C) return false;return grid[r][c][dir]>0; } inline void dij(int s) {priority_queue<Node>q;memset(done,0,sizeof(done));memset(dis,0x3f,sizeof(dis));dis[s]=0;q.push((Node){s,0});while(!q.empty()){int u=q.top().u;q.pop();if(done[u]) continue;done[u]=1;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(dis[v]>dis[u]+edge[i].dis){dis[v]=dis[u]+edge[i].dis;q.push((Node){v,dis[v]});}}} } int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifwhile(scanf("%d%d%d%d%d%d",&R,&C,&r1,&c1,&r2,&c2)==6){if(R==0&&C==0) break;memset(head,0,sizeof(head));t=0;for(int r=1;r<=R;r++){for(int c=1;c<=C-1;c++)grid[r][c][Right]=grid[r][c+1][Left]=read();if(r!=R)for(int c=1;c<=C;c++)grid[r][c][Down]=grid[r+1][c][Up]=read();}n=0;memset(id,0,sizeof(id));for(int dir=0;dir<4;dir++)if(cango(r1,c1,dir))add(0,ID(r1+dr[dir],c1+dc[dir],dir,1),grid[r1][c1][dir]*2);for(int r=1;r<=R;r++)for(int c=1;c<=C;c++)for(int dir=0;dir<4;dir++) if(cango(r,c,inv[dir]))for(int newdir=0;newdir<4;newdir++) if(cango(r,c,newdir))for(int doubled=0;doubled<2;doubled++){int newr=r+dr[newdir];int newc=c+dc[newdir];int v=grid[r][c][newdir],newdoubled=0;if(dir!=newdir){if(!doubled) v+=grid[r][c][inv[dir]];newdoubled=1;v+=grid[r][c][newdir];}add(ID(r,c,dir,doubled),ID(newr,newc,newdir,newdoubled),v);}dij(0);int ans=INF;for(int dir=0;dir<4;dir++) if(cango(r2,c2,inv[dir]))for(int doubled=0;doubled<2;doubled++){int v=dis[ID(r2,c2,dir,doubled)];if(!doubled) v+=grid[r2][c2][inv[dir]];ans=min(ans,v);}printf("Case %d: ",++kase);if(ans==INF) printf("Impossible\n");else printf("%d\n",ans);}return 0; }

例題18 低價空中旅行

給你一些票,每張聯票上標明上面以此經過的站,以及本票的價錢。必須從頭開始坐,可以在中途任何一站下飛機,下飛機后票上繳,不可以再次使用本票。
現在給出一些行程單,問如何買票能使得總花費最小(同一種票能夠買多張)。輸入保證行程總是可行的,行程單上的城市必須按照順序到達,但是中間可以經過一些輔助城市。
輸入保證每組數據最多包含20種聯票和20個行程單,聯票或者行程單上的相鄰城市保證不同。票和行程單都從1開始編號。

#include<cstdio> #include<cstring> #include<vector> #include<queue> #include<map> #include<stack> #include<algorithm> using namespace std; const int maxn=4100; const int inf=1e9; struct HeapNode {int d,u;bool operator<(const HeapNode& rhs)const{return d>rhs.d;} }; struct Edge{int from,to,dist,id;}; struct Dijkstra {int n,m;vector<Edge>edges;vector<int>G[maxn];bool done[maxn];int d[maxn],p[maxn]; void init(int n){this->n=n;for(int i=0;i<n;i++)G[i].clear();edges.clear();}void AddEdge(int from,int to,int dist,int id){edges.push_back((Edge){from,to,dist,id});m=edges.size();G[from].push_back(m-1);}void dij(int s){priority_queue<HeapNode>Q;for(int i=1;i<=n;i++)d[i]=inf;d[s]=0;memset(done,0,sizeof(done));Q.push((HeapNode){0,s});while(!Q.empty()){HeapNode x=Q.top();Q.pop();int u=x.u;if(done[u])continue;done[u]=true;for(int i=0;i<G[u].size();i++){Edge& e=edges[G[u][i]];if(d[e.to]>d[u]+e.dist){d[e.to]=d[u]+e.dist;p[e.to]=G[u][i];Q.push((HeapNode){d[e.to],e.to});}}}}void print(int s,int t){stack<int>stk;while(t!=s){stk.push(edges[p[t]].id);t=edges[p[t]].from;}while(!stk.empty()){printf(" %d",stk.top());stk.pop();}printf("\n");} }solver; int id[12][410],res,tot; vector<int>ticket[21]; map<int,int>mp; inline int ID(int x) {if(!mp.count(x)) mp[x]=++tot;return mp[x]; } inline int ID2(int x,int y) {if(id[x][y]==0) id[x][y]=++res;return id[x][y]; } int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifint n,m,q,u,v,money,kase=0;while(~scanf("%d",&n)&&n){int cost[21];mp.clear();tot=0;for(int i=1;i<=n;i++){ticket[i].clear(); scanf("%d%d",&cost[i],&m);for(int j=1;j<=m;j++){scanf("%d",&u);ticket[i].push_back(ID(u));}}kase++;scanf("%d",&q);vector<int>line;for(int p=1;p<=q;p++){int num;line.clear();memset(id,0,sizeof(id));res=0;scanf("%d",&num);for(int i=1;i<=num;i++){scanf("%d",&u);line.push_back(ID(u));}solver.init(num*tot+1);for(int tic=1;tic<=n;tic++)for(int pos=1;pos<num;pos++){int next=pos;for(int i=1;i<ticket[tic].size();i++){if(ticket[tic][i]==line[next])next++;solver.AddEdge(ID2(pos,ticket[tic][0]),ID2(next,ticket[tic][i]),cost[tic],tic);if(next==num) break;}}solver.dij(ID2(1,line[0]));int ans=solver.d[ID2(num,line[num-1])];printf("Case %d, Trip %d: Cost = %d\n",kase,p,ans);printf(" Tickets used:");solver.print(ID2(1,line[0]),ID2(num,line[num-1]));}} }

例題19 動物園大逃亡

平面圖轉對偶圖,用最短路求最小割。

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define S 0 #define T tot+1 #define MAXN 5000010 using namespace std; int n,m,t,cur,kase,tot; int dis[MAXN],done[MAXN],head[MAXN],id[1010][1010][2]; struct Node {int u,d;friend bool operator <(struct Node x,struct Node y){return x.d>y.d;} }; struct Edge{int nxt,to,dis;}edge[MAXN<<1]; inline void add(int from,int to,int dis) {// printf("[%d %d] %d\n",from,to,dis);edge[++t].nxt=head[from],edge[t].to=to,edge[t].dis=dis,head[from]=t;edge[++t].nxt=head[to],edge[t].to=from,edge[t].dis=dis,head[to]=t; } inline void dij() {priority_queue<Node>q;memset(dis,0x3f,sizeof(dis));memset(done,0,sizeof(done));q.push((Node){S,0});dis[S]=0;while(!q.empty()){int u=q.top().u; q.pop();if(done[u]) continue;done[u]=1;for(int i=head[u];i;i=edge[i].nxt){int v=edge[i].to;if(dis[u]+edge[i].dis<dis[v])dis[v]=dis[u]+edge[i].dis,q.push((Node){v,dis[v]});}} } int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifwhile(scanf("%d%d",&n,&m)==2&&n+m){memset(head,0,sizeof(head));t=tot=0;n--,m--;// printf("n=%d m=%d\n",n,m);for(int i=0;i<=n+1;i++)for(int j=0;j<=m+1;j++)for(int k=0;k<=1;k++)id[i][j][k]=++tot;for(int i=1;i<=n+1;i++){int x;for(int j=1;j<=m;j++){scanf("%d",&x);add(id[i][j][1],id[i-1][j][0],x);}}for(int i=1;i<=n;i++){int x;for(int j=1;j<=m+1;j++){scanf("%d",&x);add(id[i][j][0],id[i][j-1][1],x);}}for(int i=1;i<=n;i++){int x;for(int j=1;j<=m;j++){scanf("%d",&x);add(id[i][j][1],id[i][j][0],x);}}for(int i=1;i<=n;i++) add(S,id[i][0][1],0);for(int j=1;j<=m;j++) add(S,id[n+1][j][1],0);for(int j=1;j<=m;j++) add(id[0][j][0],T,0);for(int i=1;i<=n;i++) add(id[i][m+1][0],T,0);dij();printf("Case %d: Minimum = %d\n",++kase,dis[T]);// printf("%d\n",dis[T]);}return 0; }

轉載于:https://www.cnblogs.com/fengxunling/p/10851094.html

總結

以上是生活随笔為你收集整理的算法竞赛入门经典 写题笔记(第五章 图论算法与模型2)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久久国产精品一区二区中文 | 99久久日韩精品视频免费在线观看 | 久久99久久久久久 | 91免费黄视频 | 91视频麻豆| 久久99精品国产99久久6尤 | 亚洲乱码国产乱码精品天美传媒 | 国产免费久久精品 | 免费看国产黄色 | 久久a v视频| 在线观看视频国产一区 | 天天爽夜夜爽人人爽一区二区 | 久久国产一区二区 | 天天干天天操天天干 | 日韩精品一区二区在线观看 | 91九色最新地址 | 国产对白av| 中文字幕一区二区三区四区久久 | 美女网站在线免费观看 | 国内丰满少妇猛烈精品播放 | 久草在线视频资源 | 日日爽视频 | 国产资源免费在线观看 | 一区二区三区福利 | 狠狠躁日日躁狂躁夜夜躁 | 国产日韩欧美视频在线观看 | 亚洲精品一区中文字幕乱码 | 中文久草| 天天躁日日躁狠狠躁 | 欧美一级特黄aaaaaa大片在线观看 | 最近在线中文字幕 | 国产精品刺激对白麻豆99 | 99看视频在线观看 | 永久黄网站色视频免费观看w | 国产丝袜网站 | 黄色一及电影 | 97精品超碰一区二区三区 | 欧美性色19p | 亚洲精品永久免费视频 | 国产破处精品 | 国产91粉嫩白浆在线观看 | 色com网| 精品黄色在线 | 日日夜夜精品视频 | 亚洲欧美日韩一二三区 | 国产免码va在线观看免费 | 久久九九久久 | 91精品爽啪蜜夜国产在线播放 | 国产高清精品在线观看 | 久久久久久久久久久高潮一区二区 | 精品视频免费在线 | 国产精品18久久久久vr手机版特色 | 欧美色图另类 | 久久久国产一区二区三区四区小说 | 亚洲va天堂va欧美ⅴa在线 | 另类老妇性bbwbbw高清 | 99久久久久成人国产免费 | 视频福利在线 | 亚洲成人黄色网址 | av成人免费观看 | 国产性xxxx| 日本爱爱片 | 国产精品亚洲精品 | 五月天色综合 | h视频日本| 在线播放一区二区三区 | 国产日韩在线一区 | 96av在线视频 | 久久av在线播放 | 91看片在线观看 | 波多野结衣电影久久 | www.看片网站 | 韩国视频一区二区三区 | 免费国产在线观看 | 美女国内精品自产拍在线播放 | 色婷婷综合视频在线观看 | 97国产精品亚洲精品 | 最近免费中文字幕mv在线视频3 | 久久久久久久久网站 | 日日干av| 成人在线一区二区三区 | 天天色天天干天天色 | 97在线视频网站 | 97色在线视频 | 国产精品综合在线观看 | 午夜精品成人一区二区三区 | 日本在线视频网址 | 国产 一区二区三区 在线 | 欧美成年人在线视频 | 久久久久久久久久久久久久电影 | 国产精品一区二区视频 | 亚洲精品成人免费 | 人人干天天干 | 日韩理论电影在线观看 | 国产毛片aaa | av在线超碰 | 久久a久久 | 麻豆一区在线观看 | 国产精品久久久久久久av电影 | 国产午夜三级一区二区三桃花影视 | 麻豆一二三精选视频 | 成人午夜性影院 | 国产亚洲视频在线 | 久久久国产成人 | 午夜色站| 国产精品久久婷婷六月丁香 | 狠狠色丁香 | 一区二区三区四区五区六区 | 国产午夜在线 | 国产99久久久久 | 精品国产免费看 | 日韩av免费在线电影 | 96亚洲精品久久久蜜桃 | 欧美成a人片在线观看久 | 欧美极品xxx | 日韩中文免费视频 | 亚洲精品国内 | 天天干,天天草 | 色老板在线视频 | 亚洲国产日韩av | 国产又粗又硬又爽的视频 | 午夜18视频在线观看 | 国产女人40精品一区毛片视频 | 96av在线视频 | 国产高清久久久久 | 日韩在线首页 | 中文在线免费看视频 | 中文字幕在线播放日韩 | 亚洲激情综合网 | 精品国产1区2区3区 国产欧美精品在线观看 | 免费av观看网站 | 午夜视频黄 | 亚洲精品在线一区二区三区 | 精品国产91亚洲一区二区三区www | 怡红院成人在线 | 国产精品99在线播放 | 亚洲精品视频大全 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 久久亚洲人 | 国产 字幕 制服 中文 在线 | 91精品免费在线观看 | 精品久久99 | 午夜久久网 | 中文字幕之中文字幕 | 91精品入口 | 菠萝菠萝在线精品视频 | 日本精a在线观看 | 国产91综合一区在线观看 | 日本黄色免费在线 | 欧美电影在线观看 | 色天堂在线视频 | 亚洲午夜av电影 | 国产一二区视频 | 91成人精品一区在线播放69 | 91精品视频观看 | 亚洲视频在线观看 | 91九色视频在线播放 | 成人资源站 | 天天干天天操天天入 | 国产成人一区二区三区免费看 | 久久综合爱 | 久久精品视频免费 | 欧美在线观看视频一区二区三区 | 亚洲成av人影片在线观看 | 天天插天天射 | 亚洲成人午夜av | 色偷偷男人的天堂av | 欧美成人xxxxxxxx | a电影免费看 | 激情婷婷av| 国产精品麻豆99久久久久久 | 亚洲国产97在线精品一区 | 成人久久精品视频 | wwwav视频| 成人精品一区二区三区电影免费 | 精品一区av | 久久伊人八月婷婷综合激情 | 中文字幕91 | ,久久福利影视 | 五月婷婷中文网 | 亚洲欧洲xxxx | 超碰公开在线观看 | japanesexxxhd奶水 91在线精品一区二区 | 亚洲国产欧美在线人成大黄瓜 | 福利电影一区二区 | 91精品国产91| 国产伦精品一区二区三区在线 | 亚洲精品视频在线播放 | 亚洲精品在线免费播放 | 国产日韩视频在线播放 | 国产一级黄色av | 九色在线 | 国产精品99久久久久人中文网介绍 | 国产在线观看,日本 | 久草在线视频首页 | 九九视频网| 亚洲婷婷在线 | 456成人精品影院 | 中文字幕亚洲国产 | 91手机视频在线 | 麻豆免费视频观看 | 黄色a一级片 | 国产999视频在线观看 | 精品久久久久久亚洲 | 国产成人一区二区三区免费看 | 亚洲精品视频网站在线观看 | 一区中文字幕 | 人人澡人人爱 | www.久久色| 黄色软件在线观看 | 亚州黄色一级 | 丝袜av网站 | 国产精品久久一卡二卡 | 久久伦理 | 99精品视频在线观看视频 | 欧美午夜a | 色婷婷综合久色 | 国产精品久久久久久久久久免费看 | 欧美在线视频日韩 | 超级碰碰免费视频 | 婷婷5月色| 欧洲亚洲国产视频 | av免费看电影 | 天天天天天天干 | 婷婷伊人网 | 久久五月婷婷丁香社区 | 九九热在线视频免费观看 | 亚洲伊人天堂 | 天天曰视频 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 亚洲黄色片 | 国产精品99久久久久久大便 | 成人一区二区在线观看 | 久久综合五月婷婷 | 伊人色综合久久天天 | 狠狠色狠狠色综合日日小说 | 久久久综合精品 | 亚洲综合成人专区片 | 国产精品网站一区二区三区 | 三级黄色理论片 | 麻豆免费看片 | 激情av在线播放 | 免费观看性生交大片3 | 国产福利久久 | 国产一区 在线播放 | 国产精品v a免费视频 | 麻豆视频国产在线观看 | 亚洲精品在 | 亚洲精品视频在线观看免费视频 | 日韩av综合网站 | 色网址99 | 国产亚洲精品福利 | 成人h视频在线播放 | 欧美美女激情18p | 麻豆传媒视频在线 | 手机av观看 | 日批在线观看 | 美女免费黄网站 | 超碰人人干人人 | 久久香蕉电影 | 中文字幕在线网 | 999在线观看视频 | 91中文字幕一区 | 国产又粗又猛又色 | 国产区 在线 | 久久怡红院 | 偷拍视频一区 | 亚洲精品动漫在线 | 国产高清av免费在线观看 | 精品国产伦一区二区三区观看说明 | 黄色片视频在线观看 | 91在线一区二区 | 69国产在线观看 | 成人天堂网 | 欧美激情精品久久久久久变态 | 欧美日韩视频在线一区 | 国产女人免费看a级丨片 | 亚洲精选视频在线 | 国产亚洲亚洲 | 免费日韩 精品中文字幕视频在线 | 日本不卡123区 | 国产精品久久9 | 五月天开心 | 99久久99久国产黄毛片 | 手机在线永久免费观看av片 | 国产一区二区三区免费在线观看 | 久草在线视频首页 | 在线观看欧美成人 | 国产精品一区欧美 | 国产99久| 国产小视频在线看 | av免费在线网站 | 美女视频黄免费网站 | 国产一线天在线观看 | 亚洲精品www久久久久久 | 欧美午夜精品久久久久 | 国产精品视频久久 | 99久在线精品99re8热视频 | 三级在线国产 | 婷婷激情五月 | 国产激情久久久 | 一级做a爱片性色毛片www | 国产 亚洲 欧美 在线 | 久久视频6 | 欧美aa一级片 | 久久er99热精品一区二区三区 | 亚洲日本在线视频观看 | 国产精品一区欧美 | 狠狠久久综合 | 欧美日韩一区二区视频在线观看 | 天天草天天干天天 | 国产精品大全 | 精品国产一区二区三区四区vr | 二区三区在线视频 | 黄色大全免费观看 | 国产专区视频 | 色综合天天综合在线视频 | 国产乱码精品一区二区蜜臀 | 日韩在线视频网 | 久久tv| 97超碰国产精品女人人人爽 | 色.www | 亚洲欧洲精品在线 | 在线观看国产区 | 日本精品久久久久中文字幕 | 免费a网 | 天天色天天上天天操 | 欧美日韩视频 | 国产在线观看午夜 | 综合色中文 | 精品国产一区二区三区四区vr | 九九九在线观看 | www夜夜| 色综合咪咪久久网 | 国产精品网红直播 | 在线视频 国产 日韩 | 狠狠操.com| 激情五月播播久久久精品 | 亚洲精品白浆高清久久久久久 | 日韩精品久久久久久中文字幕8 | 精品国产精品久久 | 久久久午夜精品理论片中文字幕 | 亚洲一区二区观看 | 夜夜躁日日躁狠狠久久88av | 日韩激情视频 | 免费成人在线视频网站 | 亚洲综合色视频在线观看 | 高清av中文在线字幕观看1 | 少妇av片 | 欧美在线视频一区二区三区 | 色综合婷婷 | 精品91视频 | 最近高清中文字幕在线国语5 | 久久在线电影 | 国产精品久久久久久电影 | 婷婷在线免费观看 | 干 操 插 | 久草在| 8x成人免费视频 | 99视频在线观看免费 | 色播六月天 | 毛片播放网站 | www黄免费| 久久久影片| 在线观看你懂的网站 | 手机在线中文字幕 | 香蕉网在线 | 97在线看 | 久久精品亚洲一区二区三区观看模式 | av天天色 | 天堂在线免费视频 | 国产精品久久久影视 | 亚洲国产精品久久久久久 | 在线视频观看亚洲 | 国产欧美日韩精品一区二区免费 | 99热国内精品 | 日韩av影片在线观看 | 免费精品在线视频 | 91精品国产自产91精品 | www.五月婷| 久艹视频在线观看 | 99热这里只有精品国产首页 | 色中射| 午夜黄色大片 | 日韩欧美视频在线观看免费 | 人人草天天草 | 日韩视频免费在线 | 色综合天天综合网国产成人网 | 最近的中文字幕大全免费版 | 国产精品麻豆视频 | 日韩精品一区不卡 | 免费日韩三级 | 精品久久九九 | 97色在线观看 | 久久精品牌麻豆国产大山 | 欧美极品在线播放 | www.超碰 | 99精品影视| 国产精品乱码久久 | www.天天操.com | 91麻豆精品国产91久久久无需广告 | 国产伦精品一区二区三区免费 | 国产精品综合久久久久 | 人人澡人人爽 | 一级欧美日韩 | 中文字幕欧美日韩va免费视频 | 国产香蕉视频 | 国产精品久久久电影 | 中文字幕一区二区三区四区 | 久久在线视频精品 | 日韩中文字幕在线看 | 精品国产电影 | 99精品国产高清在线观看 | 天天综合网 天天综合色 | 成人午夜剧场在线观看 | 超碰免费久久 | 免费看v片 | 久久免费精品国产 | 中文字幕五区 | 四虎成人精品永久免费av九九 | 久久久91精品国产一区二区精品 | 99在线精品视频观看 | 天天激情在线 | 精品国精品自拍自在线 | 在线观看一区二区视频 | 国产xxxx | 中文字幕av电影下载 | 少妇av网 | 91污视频在线观看 | 91亚洲精品久久久久图片蜜桃 | 亚洲成人黄色在线 | 亚洲视频99 | 精品毛片一区二区免费看 | 日韩三级视频在线观看 | 国产一二区精品 | 又黄又网站 | 欧美日韩精品在线一区二区 | aav在线| 黄色三级免费看 | 亚洲黄色软件 | 亚洲欧美激情精品一区二区 | 九色视频网址 | 久久在线一区 | 97av在线视频 | 国产精品高清一区二区三区 | 欧美日韩国产高清视频 | a视频免费看 | 国内久久视频 | 国产xx在线 | 香蕉视频在线免费看 | 五月天婷亚洲天综合网精品偷 | 丁香综合五月 | 成人禁用看黄a在线 | 又黄又爽又色无遮挡免费 | 91免费观看 | 免费看的黄色小视频 | 国产精品免费视频网站 | 五月开心激情 | 2019天天干天天色 | 伊人资源站| 亚洲高清激情 | 99久久日韩精品免费热麻豆美女 | 国产午夜三级一区二区三桃花影视 | 成人在线播放网站 | 日韩资源在线观看 | 免费一级日韩欧美性大片 | 日韩欧美在线中文字幕 | 欧美激情综合五月色丁香 | 丁香视频在线观看 | 国内综合精品午夜久久资源 | 成人四虎 | 亚洲视频 在线观看 | 91九色蝌蚪视频网站 | 黄色免费大全 | 久久精品欧美一 | 欧美日韩中文字幕综合视频 | 亚洲成a人片在线www | 久久精品国产一区二区三区 | 日韩av一区二区三区在线观看 | 成人国产精品久久久 | 成人免费在线网 | 免费a视频 | 91在线中文字幕 | 国产成人黄色 | av福利在线导航 | 日韩av免费一区 | 一区中文字幕 | 国产成人不卡 | 激情五月亚洲 | 久久这里只有精品视频99 | 欧美一级片在线免费观看 | 国产美女在线免费观看 | 最新国产中文字幕 | 麻豆精品国产传媒 | 国产午夜精品理论片在线 | 久久国产成人午夜av影院宅 | 国产九九在线 | 亚州成人av在线 | 日本h视频在线观看 | 精品久久久久久亚洲综合网站 | 久久久国产99久久国产一 | 国产精品免费人成网站 | 欧美日韩视频一区二区 | 日本精品一区二区三区在线观看 | 亚洲少妇自拍 | 日韩在线视频在线观看 | 色婷婷www | 久久色亚洲 | 九九影视理伦片 | 日韩视频1区 | 国产精品久久久久久久久蜜臀 | 国产人成一区二区三区影院 | 超碰日韩在线 | 99久久久久久久 | 在线观看成人福利 | 国产精品资源网 | 色夜视频 | 人人射人人爽 | 日韩激情中文字幕 | 免费h精品视频在线播放 | 精品一区二三区 | 日本爱爱片| 欧洲精品码一区二区三区免费看 | 四虎影视精品永久在线观看 | 最新免费中文字幕 | 婷婷中文字幕 | 97视频免费播放 | 久久精品视频中文字幕 | 97av精品| 成年人免费电影在线观看 | 亚洲一区二区麻豆 | 日韩在线观看a | 婷婷精品国产欧美精品亚洲人人爽 | 日本中文字幕在线观看 | 国产一级性生活视频 | 日本精品视频网站 | av黄色国产| 色婷婷在线观看视频 | 成人av一区二区三区 | 色婷婷久久一区二区 | 婷婷在线免费视频 | 婷婷看片 | 日韩在线一二三区 | 日本久久久久久久久久 | 五月天婷婷免费视频 | 国产精品一区二区三区在线免费观看 | 中文字幕专区高清在线观看 | 美女国产免费 | 国产成人精品电影久久久 | 天天干天天弄 | 国产一区视频在线 | 天天爱天天操天天射 | 蜜桃视频精品 | 毛片.com| 久久成人18免费网站 | 操操操天天操 | 国产精品网红直播 | 91精品国产91久久久久福利 | 久久国内精品99久久6app | 日韩高清免费在线观看 | 午夜91在线| 中文久久精品 | 一区二区三区在线电影 | 在线观看麻豆av | 免费看黄在线网站 | 中文字幕影片免费在线观看 | www.午夜| 丁香网婷婷 | 亚洲日本韩国一区二区 | 亚洲精品观看 | 久久爱导航 | 亚洲成人黄色网址 | av中文字幕在线观看网站 | 国产一区视频导航 | 国产资源精品 | 国产亚洲精品久久19p | 精品久久久久久亚洲综合网 | 日韩一级成人av | 国产精品毛片一区二区 | 97av影院 | 国产免费一区二区三区最新6 | 日本黄区免费视频观看 | 水蜜桃亚洲一二三四在线 | 日韩a在线| 免费看片日韩 | 欧美另类巨大 | 精品国产伦一区二区三区 | 成人免费视频播放 | 久久只精品99品免费久23小说 | 亚洲日本成人网 | 久久久免费毛片 | 激情五月综合 | 欧美午夜一区二区福利视频 | 99国产高清| 国产精品久久久久久久久久久久午夜片 | 超碰av在线 | aaa日本高清在线播放免费观看 | 色无五月| 久久专区| 日本在线观看一区二区 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 最新婷婷色 | 在线国产精品一区 | 波多野结衣在线播放视频 | 国产美女在线精品免费观看 | 国产一区二区三区免费在线 | 色美女在线 | 成人av网站在线观看 | 三级黄色在线观看 | 99一级片 | 日韩成人精品一区二区 | 波多野结衣视频一区 | 午夜久久久精品 | 蜜桃视频日韩 | 999视频网 | 黄色的网站免费看 | 亚洲热久久 | 免费福利视频网站 | 精品色999| 欧美激情在线看 | 日韩在线观看电影 | 毛片网站在线看 | 国产免费一区二区三区网站免费 | 免费av网站观看 | 亚洲国产精品资源 | 国产黄色一级片 | 美女久久久久久久久久 | 91桃花视频| 美女黄网站视频免费 | 色综合久久久久 | 中文伊人| 日本久久综合网 | 欧美综合干 | 一级做a爱片性色毛片www | 亚洲年轻女教师毛茸茸 | 免费看黄在线 | 黄色精品在线看 | 亚洲免费av在线播放 | 中文字幕亚洲综合久久五月天色无吗'' | 日本不卡一区二区三区在线观看 | 国产精品高潮呻吟久久久久 | 三级黄色网络 | 国产又粗又猛又黄又爽视频 | 国产99久久精品 | 97夜夜澡人人双人人人喊 | 国产一级免费在线观看 | 黄色小说在线观看视频 | 久久er99热精品一区二区 | 日韩在线一二三区 | 久草在线资源免费 | 久久少妇免费视频 | 欧美日韩视频在线观看免费 | 欧美日韩在线网站 | 精品亚洲成人 | 午夜精品久久久99热福利 | 久久精品久久精品久久 | 国产视频 亚洲精品 | 国产真实在线 | 久久毛片高清国产 | 韩国在线一区二区 | 久久精品2 | 欧美日韩视频在线观看一区二区 | 97超碰影视 | 成人av网站在线 | 成人午夜影院在线观看 | 欧美精品成人在线 | 国产精品一区二区久久精品爱涩 | 一区二区三区久久 | 色吧久久| 一区二区三区免费网站 | 一区二区三区四区五区六区 | 国产一级淫片免费看 | 91久久久久久久一区二区 | 色综合婷婷 | 国产成人亚洲在线观看 | 四虎影视国产精品免费久久 | 久草手机视频 | 亚洲精品乱码白浆高清久久久久久 | 天天操天天摸天天爽 | 97中文字幕 | 2019中文最近的2019中文在线 | 免费看一及片 | 国产黄色一级片 | 精品1区2区3区 | 精品亚洲一区二区三区 | 亚洲狠狠婷婷 | 色综合天天综合网国产成人网 | 五月婷婷丁香网 | 久久高清片 | 91精品视频免费观看 | 国产成在线观看免费视频 | 97视频人人免费看 | 在线视频日韩欧美 | 欧美乱码精品一区 | 天天干天天干天天色 | 99视频在线免费看 | 国产高清视频在线免费观看 | 国产成人精品一区二区三区福利 | 亚洲作爱 | 成人性生交大片免费看中文网站 | 在线观看自拍 | 久久久这里有精品 | 91精品在线播放 | 国产在线超碰 | 午夜精品视频一区二区三区在线看 | 在线观看网站黄 | 日本中文字幕在线看 | av成人免费观看 | 欧美日韩视频在线 | 99激情网 | 亚洲欧美在线视频免费 | 国产精品免费久久久久影院仙踪林 | 免费久草视频 | 国产日韩三级 | 中文字幕美女免费在线 | 激情视频二区 | 天天操天天摸天天爽 | 亚洲精品久久久久久久不卡四虎 | 久操操 | 色偷偷88888欧美精品久久 | 免费色视频网站 | 911免费视频| 精品美女在线视频 | 欧美精品久久久 | 久久久久国产一区二区 | 99精品国产在热久久 | 日韩激情精品 | 日韩特黄一级欧美毛片特黄 | 国产精品你懂的在线观看 | 亚洲最大在线视频 | www黄com| 日韩字幕在线观看 | 天天干天天草天天爽 | 国产精品久久久久一区二区三区 | 免费三级黄色片 | 久久,天天综合 | 在线欧美日韩 | 中文字幕欧美日韩va免费视频 | 在线观看黄 | 黄色免费观看网址 | 永久免费精品视频网站 | 国产精品自产拍在线观看网站 | 久久久久久久久久久国产精品 | 中日韩在线视频 | 日韩最新中文字幕 | 欧美日韩免费在线视频 | 亚洲精品小区久久久久久 | 国产精品免费观看网站 | 久久久国产精品视频 | 97天天干 | 91c网站色版视频 | 久久免费看毛片 | 久久免费国产精品1 | 成人电影毛片 | 中文字幕你懂的 | 国产精品男女啪啪 | 99久久婷婷国产综合精品 | 国产成人一区二区三区在线观看 | 91精品久久久久久久久久入口 | 午夜av在线| 免费在线观看不卡av | 九九热av | 国产v在线| 日韩一区正在播放 | 日韩视频www | 91禁在线看 | 亚洲黄色网络 | 婷婷久久国产 | 91成人免费在线 | 亚洲成人av一区二区 | 亚洲综合色丁香婷婷六月图片 | 9999国产| 插婷婷| 日韩精品一区二区三区中文字幕 | 808电影免费观看三年 | 免费看搞黄视频网站 | 久久亚洲美女 | 国产呻吟在线 | 又色又爽的网站 | 日韩综合一区二区 | 91丨九色丨蝌蚪丨对白 | 日本中文字幕高清 | 91黄色视屏 | 米奇狠狠狠888 | 麻豆激情电影 | 黄色软件网站在线观看 | 国产丝袜一区二区三区 | 欧美 另类 交 | 999成人网 | 97精品超碰一区二区三区 | 久久99精品国产一区二区三区 | 免费网站黄 | 最新av免费在线 | 亚洲一级电影 | 久久夜色电影 | 欧美久久99 | 亚洲激色 | 国产资源在线观看 | 国产青春久久久国产毛片 | 欧美狠狠操 | 日韩免费av片 | 中文字幕影视 | 狠狠色综合网站久久久久久久 | 国产婷婷视频在线 | 中文av一区二区 | 亚洲最大免费成人网 | 婷婷色综合网 | 亚洲春色综合另类校园电影 | 久久国产热视频 | 免费在线成人av电影 | 黄色av播放 | 日韩av免费大片 | 国产亚洲va综合人人澡精品 | 日本精品一区二区三区在线观看 | 成人网色 | 国产精品一区二区精品视频免费看 | 国产成人一区二区在线观看 | 亚洲成人精品 | 黄色一级免费网站 | 国产黄免费在线观看 | 四虎国产精品免费观看视频优播 | 国产做a爱一级久久 | 国产在线播放观看 | 人人狠狠综合久久亚洲婷 | 午夜视频色| www.av在线播放 | 久久一区二区免费视频 | 国产精品麻豆一区二区三区 | 久久看视频 | 亚洲欧美日韩国产一区二区 | 国产精品片 | 91在线视频在线 | 看国产黄色大片 | 日韩av资源在线观看 | 亚洲天堂社区 | 日韩欧美视频免费观看 | 日日干夜夜干 | 91专区在线观看 | 日本电影久久 | 久久免费a | 综合色天天| 国产成人一区二区三区电影 | 99草视频| 国产伦理一区二区三区 | 国产日韩欧美网站 | www.91成人| 久久久久久久久久久高潮一区二区 | 免费在线观看成年人视频 | 成人免费观看电影 | 91网站在线视频 | 欧美久久九九 | 国产a国产a国产a | 亚洲精品高清在线 | 一区免费视频 | 欧美一区中文字幕 | 人人爽人人爱 | 成人97人人超碰人人99 | 国产精品黄 | 亚洲一级黄色片 | 五月婷网 | 亚洲人成网站精品片在线观看 | 久久久久久久久久久久久影院 | 亚洲欧美色婷婷 | 九九热在线观看视频 | 探花视频网站 | 中文字幕免费不卡视频 | 久久狠狠干| 欧美日韩性 | 91精品国产欧美一区二区成人 | 69久久99精品久久久久婷婷 | 免费在线观看污网站 | 中文字幕精品三区 | 欧美性猛片 | 又污又黄网站 | www.超碰97.com| 国产精品va在线观看入 | www.久久精品视频 | 在线观看视频国产一区 | 久草在线视频资源 | 国产一级免费在线观看 | 五月激情综合婷婷 | 免费a一级 | 日韩精品不卡在线 | 亚洲作爱 | 国产自偷自拍 | 国产一级片一区二区三区 | 91精品人成在线观看 | 91精品一区二区三区久久久久久 | 国产天天爽 | 天天碰天天操视频 | 欧美日韩另类在线观看 | 久草视频免费在线播放 | 亚洲闷骚少妇在线观看网站 | 免费av在线网 | 精品国产a | 99久久99久国产黄毛片 | 中文字幕资源网 国产 | 久久综合久色欧美综合狠狠 | 久久综合免费视频影院 | 亚洲男男gaygayxxxgv| 欧美一级性生活视频 | 欧美日韩国产一区二区三区 | 日韩有码中文字幕在线 | 在线成人免费av | 精品国产一区二区三区久久久蜜月 | 免费网站观看www在线观看 | 91精彩视频 | 美女视频黄在线 | 在线视频麻豆 | 国产精品高清免费在线观看 | 亚洲国产中文字幕在线观看 | 欧美激情视频一区二区三区 | 婷婷丁香激情综合 | 久久久久久久久久国产精品 | 一区二区精品视频 | 激情偷乱人伦小说视频在线观看 | av片在线观看| 国产亚洲无 | 亚洲www天堂com | 91中文字幕永久在线 | 中文字幕黄色网 | 91av视频免费在线观看 | 亚洲欧美国产精品 | 日本精品一区二区在线观看 | 美女视频黄是免费的 | a国产精品| 精品一区欧美 | 成人h电影在线观看 | 99久久综合国产精品二区 | 91精品成人| 久久久久亚洲精品国产 | 色香com.| 精品视频亚洲 | 精品久久久成人 | 人人澡人摸人人添学生av | 99久久精品午夜一区二区小说 | 亚洲少妇xxxx | 国产99久久久国产精品免费二区 | 美女网站黄在线观看 | 欧美一级片免费观看 | 日韩av手机在线观看 | 在线精品视频在线观看高清 | 在线久草视频 | 黄色片软件网站 | 天天操天天怕 | 日韩夜夜爽 | 欧美日韩一区三区 | 天天色天天射天天干 | 在线精品在线 | 日精品| 午夜婷婷网 | 九九久久久久久久久激情 | 麻豆国产网站 | 亚洲国产精品va在线看黑人 | 日韩欧美xxx| 婷婷久久久久 | 欧美成人xxx| 果冻av在线 | 在线看片视频 | 99r在线精品 | 亚洲一区不卡视频 | 亚洲欧美国产精品va在线观看 | 97视频免费观看2区 亚洲视屏 | 色999在线 | 顶级欧美色妇4khd | 麻豆国产视频下载 | 亚洲精品高清一区二区三区四区 | 又紧又大又爽精品一区二区 | 日韩成人一级大片 | 日韩电影一区二区在线 | 午夜精品久久久99热福利 | 国产视频高清 | www.国产毛片| 日韩视频免费观看高清 | 一级黄色毛片 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 黄色网址在线播放 | av动图| 国产精品观看视频 | www.成人精品 | 欧美日韩观看 | 国产精品av久久久久久无 | www久久九 | 日韩av区 | 五月婷婷激情六月 | 西西www4444大胆在线 | 久久综合狠狠综合久久综合88 | 亚洲91精品 | 国产专区免费 | 国产精品九九久久久久久久 | 国产女人免费看a级丨片 | 探花视频在线观看免费 | 亚洲免费成人 | 久久精品视频中文字幕 | 欧美日韩视频 | 亚洲国产欧美在线看片xxoo | 黄污视频网站大全 | av中文字幕在线免费观看 |