青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

算法學社
記錄難忘的征途
posts - 141,comments - 220,trackbacks - 0

題目描述:

    給一個點數為N(N<1,000)的圖,Q次詢問. 每次詢問如果第i條邊的值變為v, 這條邊是否可能會在最小生成樹中.

吐槽:

    1. 由于邊比較稠密,所以這兩種方法差不多....

算法分析:

    其實和次小生成樹沒什么關系額...
    就是prim求mst的時候順便把max[u][v],求出來. max[u][v]指的是u到v的最大邊.
    求法就是 : 在考慮點v的時候, 假設之間遍歷的點的max值已經兩兩求出了... 
    則有max[u][v] = max_value(max[u][P[v]], edge[u][v]);
    詢問的時候就比較更新的值和max[u][v]就好了....
    
    樹鏈剖分就是在線求max[u][v](ps: 支持更新的哦~~~)...
prim版:
因為寫這個是拿來對拍的,所以寫的不是很好...
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cassert>
 4 using namespace std;
 5 #define re(i,n) for(int i=0;i<n;i++)
 6 #define re1(i,n) for(int i=1;i<=n;i++)
 7 const int V = 1005;
 8 const int E = 1000005;
 9 template <typename T> inline void chkmax (T &a, T b) {if(a<b) a=b;}
10 int G[V][V],mx[V][V],low[V],vis[V],P[V];
11 struct edge{
12     int u,v;
13     edge(int U=0,int V=0) : u(U), v(V) {}
14 } num[E];
15 const int inf = ~0u>>2;
16 int n,m,q;
17 void prim(){
18     for(int i=0;i<n;i++){
19         low[i] = inf;
20         vis[i] = 0;
21     }
22     low[0] = 0;
23     for(int j=0;j<n;j++){
24         int s=-1, mn = inf;
25         for(int i=0;i<n;i++)
26             if(!vis[i] && mn > low[i]){
27                 s = i; mn = low[i];
28             }
29         assert(s!=-1);
30 //        cout<<"s: "<<s<<" "<<mn<<endl;
31 //        cout<<P[s]<<endl;
32         for(int i=0;i<n;i++) if(vis[i]){
33             mx[s][i] = max(mx[i][P[s]],mn);
34             mx[i][s] = mx[s][i];
35 //            cout<<"i: "<<i<<" "<<mx[i][s]<<endl;
36         }
37         
38         vis[s] = 1;
39         for(int i=0;i<n;i++) if(!vis[i] && G[s][i] < low[i]){
40             low[i] = G[s][i]; P[i] = s;
41         }
42     }
43 //    for(int i=0;i<n;i++) cout<<low[i]<<" "; cout<<endl;
44 }
45 int main(){
46     while(~scanf("%d%d%d",&n,&m,&q)){
47         int u,v,c;
48         for(int i=0;i<n;i++) for(int j=0;j<n;j++){
49             G[i][j] = inf;
50             mx[i][j] = 0;
51         }
52         for(int i=0;i<m;i++){
53             scanf("%d%d%d",&u,&v,&c);
54             u--;v--;
55             num[i] = edge(u,v);
56             if(c < G[u][v]) {
57                 G[u][v] = G[v][u] = c;
58             }
59         }
60         prim();
61 //        for(int i=0;i<n;i++) { for(int j=0;j<n;j++) cout<<mx[i][j]<<" "; cout<<endl;}
62         while(q--){
63             scanf("%d%d",&u,&v);
64             u--;
65             int a = num[u].u, b = num[u].v;
66             puts(mx[a][b] >= v?"Yes": "No");
67         }
68     }
69 }
70 
剖分樹版:
這個是認真寫的...
  1 // poj 2831 by figo in 5,19,2012
  2 // template
  3 #include<iostream>
  4 #include<algorithm>
  5 #include<cassert>
  6 #include<cstdio>
  7 #include<cstdlib>
  8 using namespace std;
  9 template <typename T> inline void chkmax(T &a, T b){if(a<b) a=b;}
 10 // graph
 11 const int V = 1005;
 12 const int E = 200005;
 13 int head[V],pnt[E],nxt[E],cost[E],flag[E];
 14 int n,e;
 15 void add_edge(int u,int v,int c){
 16     nxt[e] = head[u];
 17     pnt[e] = v;
 18     head[u] = e;
 19     cost[e] = c;
 20     e ++;
 21 }
 22 // kruskal
 23 int parent[V];
 24 struct edge{
 25     int u,v,c,id;
 26     edge() {}
 27     edge(int U,int V,int C,int ID) : u(U), v(V), c(C), id(ID) {}
 28     bool operator < (edge A) const {
 29         return c < A.c;
 30     }
 31 } num[E];
 32 int find(int x){ return x == parent[x] ? x : parent[x] = find(parent[x]);}
 33 void kruskal(){
 34     int len = 0;
 35     for(int u = 0; u< n; u++)
 36         for(int i = head[u]; i!=-1;i = nxt[i])
 37             num[len++] = edge(u,pnt[i],cost[i],i);
 38     assert(len == e);
 39     sort(num, num+len);
 40     for(int i=0;i<n;i++)
 41         parent[i] = i;
 42     for(int i=0;i<len;i++) flag[i] = 0;
 43     for(int i = 0; i< len; i++){
 44         int u = num[i].u, v = num[i].v,id = num[i].id;
 45         if(find(u) == find(v)) continue;
 46         flag[id] = flag[id ^ 1] = 1;
 47         parent[parent[u]] = parent[v];
 48     }
 49 }
 50 // seg_ment tree
 51 int seg[V<<2], M;
 52 int find(int l,int r){
 53     int ans = 0;
 54     for(l += M-1, r += M+1; l^r^1; l>>=1, r>>=1){
 55         if(~l&1) chkmax(ans,seg[l^1]);
 56         if(r&1) chkmax(ans,seg[r^1]);
 57     }
 58     return ans;
 59 }
 60 void insert(int pos, int x){
 61     pos += M;
 62     seg[pos] = x;
 63     while(pos>>=1){
 64         seg[pos] = max(seg[pos << 1] , seg[pos << 1 | 1]);
 65     }
 66 }
 67 // prepare
 68 int deep[V],size[V],heavy[V],P[V];
 69 void dfs(int u,int f){
 70     size[u] = 1;
 71     int mx = 0, s = -1;
 72     for(int i=head[u]; i!=-1;i = nxt[i]){
 73         if(!flag[i] || pnt[i] == f) continue;
 74         int v = pnt[i];
 75         P[v] = i^1;
 76         deep[v] = deep[u] + 1;
 77         dfs(v,u);
 78         if(size[v] > mx){
 79             mx = size[v];
 80             s = i;
 81         }
 82         size[u] += size[v];
 83     }
 84     heavy[u] = s;
 85     if(s!=-1) parent[pnt[s]] = u;
 86 }
 87 void prepare(){
 88     kruskal();
 89     for(int i=0;i<n;i++) parent[i] = i;
 90     deep[0] = 0;
 91     P[0] = -1;
 92     dfs(0,0);
 93     for(int i=30;i;i--) if((1<<i) > n+1) M = 1<<i;
 94     for(int i=0;i<2*M;i++) seg[i] = 0;
 95     int len = 1;
 96     for(int u = 0; u<n; u++) if(heavy[u] == -1){
 97         int v = u;
 98         while(v && pnt[heavy[pnt[P[v]]]] == v){
 99             insert(len,cost[P[v]]);
100             flag[P[v]] = flag[P[v]^1] = len ++;
101             v = pnt[P[v]];
102         }
103     }
104 }
105 // operator
106 int lca(int u,int v){
107     while(1){
108         int a = find(u), b = find(v);
109         if(a == b) return deep[u]<deep[v] ? u : v;
110         else if(deep[a] > deep[b]) u = pnt[P[a]];
111         else v = pnt[P[b]];
112     }
113 }
114 int query(int u,int v){
115     int ans = 0;
116 //    cout<<u<<" "<<v<<endl;
117     while(u != v){
118         //cout<<u<<endl;
119         int l = P[u];
120         if(pnt[heavy[pnt[P[u]]]] == u){
121             int p = find(u);
122             if(deep[p] < deep[v]) p = v;
123         //    cout<<u<<" "<<p<<endl;
124             int r = heavy[p];
125             assert(flag[l] <= flag[r]);
126             int mx = find(flag[l],flag[r]);
127             chkmax(ans,mx);
128             u = p;
129         }
130         else {
131             chkmax(ans,cost[l]);
132             u = pnt[l];
133         }
134     }
135     //cout<<"ans:"<<ans<<endl;
136     return ans;
137 }
138 int ask(int E,int val){
139     int u = pnt[E<<1];
140     int v = pnt[E<<1|1];
141     int p = lca(u,v);
142     //cout<<u<<" "<<v<<" "<<p<<endl;
143     return val <= query(u,p) || val <= query(v,p);
144 }
145 // main
146 int main(){
147     int m,q,u,v,c;
148     while(~scanf("%d%d%d",&n,&m,&q)){
149          e= 0;
150          for(int i=0;i<n;i++) head[i] = -1;
151          for(int i=0;i<m;i++) {
152              scanf("%d%d%d",&u,&v,&c);
153             u--; v--;
154             add_edge(u,v,c);
155             add_edge(v,u,c);
156          }
157          prepare();
158          while(q--){
159              scanf("%d%d",&u,&v);
160             u--;
161             puts(ask(u,v) ? "Yes": "No");
162          }
163     }
164     return 0;
165 }
166 
posted on 2012-05-20 15:22 西月弦 閱讀(516) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美成人精品不卡视频在线观看| 欧美国产精品va在线观看| 欧美一区2区三区4区公司二百| 亚洲无线视频| 亚洲香蕉网站| 亚洲欧美视频在线观看| 亚洲欧洲av一区二区| 久久精品一区二区三区中文字幕| 久久亚洲国产精品一区二区| 欧美福利在线| 一卡二卡3卡四卡高清精品视频| 亚洲一区精品视频| 久久在精品线影院精品国产| 欧美精品一区三区在线观看| 国产精品成人一区二区艾草| 国产精品日韩欧美综合 | 亚洲国产日韩美| 美女视频黄免费的久久| 亚洲啪啪91| 亚洲欧美日韩精品综合在线观看| 久久影视三级福利片| 欧美日韩一区二区欧美激情| 国产夜色精品一区二区av| 亚洲黄色在线视频| 亚洲欧美在线x视频| 欧美成人免费全部| 亚洲视频在线播放| 美女国内精品自产拍在线播放| 欧美视频1区| 亚洲国产欧美日韩另类综合| 午夜视频在线观看一区二区| 亚洲黄色一区| 久久久一区二区| 国产精品美女久久久| 亚洲乱码精品一二三四区日韩在线| 久久aⅴ国产欧美74aaa| 亚洲精品一区在线观看| 久久野战av| 国产一区导航| 性欧美暴力猛交另类hd| 91久久精品国产91久久性色tv| 久久99伊人| 国产精品一区二区男女羞羞无遮挡| 亚洲精品少妇网址| 欧美电影免费观看高清完整版| 香蕉视频成人在线观看 | 亚洲一区二区高清| 欧美精品色综合| 91久久精品美女高潮| 久久一区中文字幕| 欧美freesex8一10精品| 亚洲欧美日韩国产综合精品二区| 欧美激情乱人伦| 亚洲精品美女免费| 欧美电影电视剧在线观看| 久久久久国内| 国产真实精品久久二三区| 久久国产视频网站| 欧美一区二区三区免费观看视频| 国产精品网站一区| 欧美一级一区| 先锋影音国产一区| 国产欧美日韩综合精品二区| 性感少妇一区| 欧美在线视频不卡| 伊人狠狠色j香婷婷综合| 久久综合给合| 美女日韩欧美| av不卡在线观看| 亚洲少妇在线| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美视频免费| 午夜久久久久久久久久一区二区| 亚洲性感美女99在线| 国产性色一区二区| 欧美1区2区视频| 欧美日本高清视频| 亚洲欧美日韩在线| 欧美中文字幕| 亚洲精品一区二区在线观看| 99视频一区二区| 国产一区二区三区的电影 | 亚洲国产精品一区| 欧美伦理91i| 午夜一区不卡| 另类欧美日韩国产在线| 中日韩午夜理伦电影免费| 亚洲欧美日韩国产综合精品二区| 韩日视频一区| 亚洲毛片在线| 一区二区三区无毛| 亚洲人体偷拍| 国产一区视频观看| 亚洲精品久久久久久久久久久久 | 亚洲视频狠狠| 在线看片成人| 中文在线不卡视频| 香蕉久久夜色精品国产使用方法| 国产香蕉久久精品综合网| 亚洲另类视频| 欧美在线999| 亚洲另类自拍| 欧美日韩第一页| 91久久精品国产91久久| 激情成人在线视频| 国产一区二区久久久| 亚洲制服少妇| 亚洲激情在线观看| 久久综合久色欧美综合狠狠| 夜夜嗨av色综合久久久综合网 | 欧美一级夜夜爽| 久久综合狠狠| 久久亚洲欧美| 久久国产精品72免费观看| 在线亚洲高清视频| 狠狠做深爱婷婷久久综合一区 | 中文日韩欧美| 亚洲欧洲日产国产综合网| 国产亚洲欧美一区二区| 国产日本欧美在线观看| 国产精品一区一区三区| 国产亚洲aⅴaaaaaa毛片| 国产精品二区影院| 国产精品区一区二区三| 国产精品视频久久久| 欧美不卡视频| 欧美精彩视频一区二区三区| 另类专区欧美制服同性| 久久三级视频| 久久国产欧美精品| 男人的天堂亚洲在线| 亚洲性夜色噜噜噜7777| 日韩小视频在线观看| av成人毛片| 亚洲欧美日韩在线播放| 在线观看国产精品淫| 亚洲国产成人不卡| 午夜精品理论片| 欧美成人一区二免费视频软件| 亚洲大胆视频| 午夜精品久久久久久久| 欧美日本国产精品| 一区二区三区在线免费播放| 99国产精品久久久久久久久久| 亚洲视频1区2区| 亚洲精品久久久久久久久久久久| 亚洲一区二区av电影| 欧美午夜激情在线| 亚洲国产精品久久久久婷婷老年 | 在线观看亚洲视频啊啊啊啊| 欧美精品入口| 国产喷白浆一区二区三区| 国产亚洲欧美一区二区| 在线综合视频| 欧美国产日韩免费| 欧美一级欧美一级在线播放| 国产精品看片你懂得| 亚洲婷婷国产精品电影人久久| 欧美黄色影院| 国产日韩综合| 久久久亚洲高清| 久久精品国产77777蜜臀 | 91久久精品美女| 欧美成人综合| 国产亚洲精品久久久| 日韩视频免费在线观看| 亚洲丰满在线| 欧美一区二区视频在线观看| 亚洲日本aⅴ片在线观看香蕉| 免费观看一区| 午夜视频一区在线观看| 欧美www视频| 玖玖国产精品视频| 狠狠综合久久av一区二区小说| 欧美在线观看一区| 亚洲第一在线视频| 午夜欧美精品| 久久久女女女女999久久| 国产一区久久久| 欧美国产日韩一区二区| 一区二区欧美日韩| 久久免费99精品久久久久久| 亚洲人精品午夜| 国产精品激情| 久久一区二区三区国产精品| 一区二区三区日韩精品视频| 久久久噜噜噜久久中文字幕色伊伊| 在线成人激情黄色| 欧美精品尤物在线| 欧美一区二区免费观在线| 欧美激情一区二区三区在线视频观看 | 国产亚洲精品久久久| 免费在线国产精品| 亚洲淫性视频| 亚洲欧洲免费视频| 久久亚洲私人国产精品va| 亚洲特黄一级片| 亚洲国产清纯| 国产日本欧美视频| 欧美午夜精品久久久久久孕妇|