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

最近捉的一些圖論題

Posted on 2011-05-22 11:09 Mato_No1 閱讀(439) 評論(0)  編輯 收藏 引用 所屬分類: 圖算法
【1】PKU1094
思考難度不大,就是不斷在有向圖中加邊,求加了幾條邊以后,圖中出現(xiàn)一條連接N個點的簡單路徑(就是一條長度為(N-1)的鏈),或者圖中出現(xiàn)環(huán)。判定連接N個點的簡單路徑的算法:拓撲排序,若每次隊列中有且只有一個入度為0的點,則這樣的路徑存在,所排出的順序就是結(jié)果。注意兩點:
(1)如果在前面的若干條邊加入后,已經(jīng)找到了解,那么就輸出解,結(jié)束(不管后面的邊了,即使后面的邊加入后形成環(huán)也無視),數(shù)據(jù):
In:
4 4
A<B
B<C
C<D
D<A
0 0
Out:
Sorted sequence determined after 3 relations: ABCD.(在前3條邊加入后已經(jīng)找到了解,此時無視第4條邊,直接結(jié)束)
(2)在拓撲排序中發(fā)現(xiàn)隊列中入度為0的點超過1個(即路徑不存在)時,不要直接退出,應該將排序過程進行完畢,因為可能圖中已經(jīng)形成環(huán),此時直接輸出有環(huán)的結(jié)果,數(shù)據(jù):
In:
6 6
A<B
B<C
C<D
D<E
A<F
E<C
0 0
Out:
Inconsistency found after 6 relations.(在第6條邊加入后,雖然拓撲排序中在A出隊后隊列中出現(xiàn)了BF兩個點,但不能退出,因為此時圖中已經(jīng)出現(xiàn)了環(huán)C->D->E->C,需要輸出有環(huán)的結(jié)果)
代碼:
#include <iostream>
#include 
<stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
const int MAXN = 26, MAXM = 1000;
struct edge {
    
int a, b, pre, next;
} ed[MAXM];
int n, m, e[MAXN], q[MAXN], a0[MAXM], b0[MAXM], res = 0;
void init_d()
{
    re(i, n) ed[i].a 
= ed[i].pre = ed[i].next = i;
    m 
= n;
}
void add_edge(int a, int b)
{
    ed[m].a 
= a; ed[m].b = b; ed[m].pre = ed[a].pre; ed[m].next = a; ed[a].pre = m; ed[ed[m].pre].next = m++;
}
int solve()
{
    re(i, n) e[i] 
= 0;
    re(i, n) 
for (int p=ed[i].next; p != i; p=ed[p].next) e[ed[p].b]++;
    
int front = 0, rear = -1;
    re(i, n) 
if (!e[i]) q[++rear] = i;
    
int i, j;
    
bool ff = 1;
    
while (front < n) {
        
if (front < rear) ff = 0;
        
if (front > rear) return -1;
        i 
= q[front++];
        
for (int p=ed[i].next; p != i; p=ed[p].next) {
            j 
= ed[p].b; e[j]--;
            
if (!e[j]) q[++rear] = j;
        }
    }
    
return ff;
}
int main()
{
    
int m0, x;
    
char ch1, ch2, ch;
    
while (1) {
        scanf(
"%d%d"&n, &m0);
        
if (!n) break; ch = getchar();
        init_d();
        re(i, m0) {
            scanf(
"%c%*c%c"&ch1, &ch2); ch = getchar();
            a0[i] 
= ch1 - 65; b0[i] = ch2 - 65;
        }
        res 
= 0;
        re(i, m0) {
            add_edge(a0[i], b0[i]);
            x 
= solve();
            
if (x) {res = x * (i + 1); break;}
        }
        
if (res > 0) {
            printf(
"Sorted sequence determined after %d relations: ", res);
            re(i, n) putchar(q[i] 
+ 65); puts(".");
        } 
else if (res < 0)
            printf(
"Inconsistency found after %d relations.\n"-res);
        
else puts("Sorted sequence cannot be determined.");
    }
    
return 0;
}

【2】PKU1112:
本題極其猥瑣,先求二分圖強連通分支再DP,DP時還因為會涉及負數(shù)下標而被迫改用中點型數(shù)組,最可怕的是范圍問題(可能會超范圍),無語了……真痛苦啊……(本沙茶一開始老是查不出來哪里疵了,搞了個手打的SJ……)
#include <iostream>
#include 
<stdio.h>
#include 
<stdlib.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
#define re3(i, l, r) for (int i=l; i<=r; i++)
#define rre1(i, n) for (int i=n; i>0; i--)
const int MAXN = 101, MAXM = 15500;
struct edge {
    
int a, b, pre, next;
} ed[MAXM 
+ MAXM];
int n, m, p = 0, st[MAXN], s1[MAXN], s2[MAXN], ls1[MAXN][MAXN], ls2[MAXN][MAXN], q[MAXN], reslen1 = 0, reslen2 = 0, res1[MAXN], res2[MAXN];
bool f[MAXN][MAXN + MAXN + 1];
void init_d()
{
    re(i, n) ed[i].a 
= ed[i].pre = ed[i].next = i;
    
if (n % 2) m = n + 1else m = n;
}
void add_edge(int a, int b)
{
    ed[m].a 
= a; ed[m].b = b; ed[m].pre = ed[a].pre; ed[m].next = a; ed[a].pre = m; ed[ed[m].pre].next = m++;
    ed[m].a 
= b; ed[m].b = a; ed[m].pre = ed[b].pre; ed[m].next = b; ed[b].pre = m; ed[ed[m].pre].next = m++;
}
void init()
{
    scanf(
"%d"&n); init_d();
    
int x;
    re(i, n)
        
while (1) {
            scanf(
"%d"&x);
            
if (!x) break;
            f[i][
--x] = 1;
        }
    re(i, n
-1) re2(j, i + 1, n) if (!f[i][j] || !f[j][i]) add_edge(i, j);
}
bool bfs(int x)
{
    s1[
++p] = 1; s2[p] = 0; q[0= ls1[p][0= x; st[x] = 1;
    
int i, j, v;
    
for (int front=0, rear=0; front<=rear; front++) {
        i 
= q[front]; v = st[i];
        
for (int p0=ed[i].next; p0 != i; p0=ed[p0].next) {
            j 
= ed[p0].b;
            
if (st[j] == v) return 0;
            
if (!st[j]) {
                st[j] 
= 3 - v; q[++rear] = j;
                
if (st[j] == 1) ls1[p][s1[p]++= j; else ls2[p][s2[p]++= j;
            }
        }
    }
    
return 1;
}
int cmp(const void *s1, const void *s2)
{
    
return *(int *)s1 - *(int *)s2;
}
void solve()
{
    re(i, n) 
if (!st[i] && !bfs(i)) {reslen1 = -1return;}
    f[
0][MAXN] = 1; re1(i, n) f[0][MAXN + i] = f[0][MAXN - i] = 0;
    
int x;
    re1(i, p) {
        x 
= s1[i] - s2[i];
        re3(j, MAXN 
- n, MAXN + n) f[i][j] = (j + x <= MAXN + n && f[i - 1][j + x]) || (j - x >= MAXN - n && f[i - 1][j - x]);
    }
    
int j;
    re3(i, 
0, n) {
        
if (f[p][MAXN + i]) {j = MAXN + i; break;}
        
if (f[p][MAXN - i]) {j = MAXN - i; break;}
    }
    rre1(i, p) {
        x 
= s1[i] - s2[i];
        
if (j + x <= MAXN + n && f[i - 1][j + x]) {
            re(k, s1[i]) res1[reslen1
++= ls1[i][k];
            re(k, s2[i]) res2[reslen2
++= ls2[i][k];
            j 
+= x;
        } 
else {
            re(k, s2[i]) res1[reslen1
++= ls2[i][k];
            re(k, s1[i]) res2[reslen2
++= ls1[i][k];
            j 
-= x;
        }
    }
}
void pri()
{
    
if (reslen1 == -1) puts("No solution"); else { 
        printf(
"%d", reslen1); re(i, reslen1) printf(" %d"++res1[i]); puts("");
        printf(
"%d", reslen2); re(i, reslen2) printf(" %d"++res2[i]); puts("");
    }
}
int main()
{
    init();
    solve();
    pri();
    
return 0;
}

【3】PKU1135:
本題的意思極難理解。可以將其類比為線段燃燒:有N個端點,M條線段連接它們,當某個端點被點燃后,與其關聯(lián)的所有線段也將被同時點燃,當某條線段燒光后,其相關聯(lián)的另一個端點將被它點燃(當該端點未燒掉時)。線段燃燒所需的時間與線段長度成正比,點燃燒的時間很短,忽略不計。在此過程中還有可能發(fā)生下面的事情:某條線段燃燒過程中,其另一端點也被點燃,此時該線段會在兩頭同時開始燒……現(xiàn)在,一開始點燃編號為1的點,求所有點和線段燒完的時間,以及最后燒完的線段(或點)。

分析:首先很容易發(fā)現(xiàn)一個事實,就是一個點開始燒的時間就是圖中從1到這個點的最短路長度,這樣,求出1到所有點的最短路長度,即得到了最后燒完的點的編號(最短路最長的點)。然后考慮線段,可以發(fā)現(xiàn),圖中的線段分為兩類:設該線段兩端點的最短路長度分別為d0和d1(d0<=d1),該線段的長度(燒完的時間)為len,則若d0+len=d1,則該線段不會出現(xiàn)兩頭同時在燒的情況(因為該線段是全部燒完后再點燃另一端),否則若d0+len>d1,則該線段會出現(xiàn)兩頭同時在燒的情況,此時,該線段全部燒完的時間為d0+(d0+len-d1)/2。取最大值即可。
代碼:
#include <iostream>
#include 
<stdio.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
const int MAXN = 500, MAXM = 150000, INF = ~0U >> 2;
const double zero = 1e-7;
struct edge {
    
int a, b, len, pre, next;
} ed[MAXM 
+ MAXM];
int n, m, dist[MAXN], q[MAXN + 1], res_x, res_y;
double res;
bool vst[MAXN];
void init_d()
{
    re(i, n) ed[i].a 
= ed[i].pre = ed[i].next = i;
    
if (n % 2) m = n + 1else m = n;
}
void add_edge(int a, int b, int len)
{
    ed[m].a 
= a; ed[m].b = b; ed[m].len = len; ed[m].pre = ed[a].pre; ed[m].next = a; ed[a].pre = m; ed[ed[m].pre].next = m++;
    ed[m].a 
= b; ed[m].b = a; ed[m].len = len; ed[m].pre = ed[b].pre; ed[m].next = b; ed[b].pre = m; ed[ed[m].pre].next = m++;
}
void solve()
{
    dist[
0= 0; vst[0= 1; re2(i, 1, n) {dist[i] = INF; vst[i] = 0;} q[0= 0;
    
int i, j, d0, d1, l0;
    
for (int front=0, rear=0!(front == rear + 1 || !front && rear == n); front<? front++ : front=0) {
        i 
= q[front]; d0 = dist[i];
        
for (int p=ed[i].next; p != i; p=ed[p].next) {
            j 
= ed[p].b; d1 = d0 + ed[p].len;
            
if (d1 < dist[j]) {
                dist[j] 
= d1;
                
if (!vst[j]) {vst[j] = 1; q[rear<? ++rear : rear=0= j;}
            }
        }
        vst[i] 
= 0;
    }
    res 
= -1; re(i, n) if (dist[i] - zero > res) {res = dist[i]; res_x = res_y = i;}
    
double z;
    re(i, n) {
        d0 
= dist[i];
        
for (int p=ed[i].next; p != i; p=ed[p].next) {
            j 
= ed[p].b; if (j <= i) continue;
            d1 
= dist[j]; l0 = ed[p].len;
            
if (d0 + l0 == d1 || d1 + l0 == d0) continue;
            z 
= d0 + (d1 + l0 - d0) / 2.0;
            
if (z - zero> res) {res = z; res_x = i; res_y = j;}
        }
    }
}
int main()
{
    
int No = 0, m0, a0, b0, l;
    
while (1) {
        scanf(
"%d%d"&n, &m0);
        
if (!n) break;
        No
++; init_d();
        re(i, m0) {
            scanf(
"%d%d%d"&a0, &b0, &l);
            add_edge(
--a0, --b0, l);
        }
        solve();
        
if (No > 1) puts("");
        printf(
"System #%d\n", No);
        
if (res_x == res_y)
            printf(
"The last domino falls after %.1f seconds, at key domino %d.\n", res, ++res_x);
        
else
            printf(
"The last domino falls after %.1f seconds, between key dominoes %d and %d.\n", res, ++res_x, ++res_y);
    }
    
return 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>
            国产欧美日韩在线观看| 亚洲尤物视频在线| 亚洲午夜黄色| 欧美日韩国产限制| 美腿丝袜亚洲色图| 久久9热精品视频| 欧美一级欧美一级在线播放| 欧美亚洲三区| 久久免费黄色| 欧美日本一道本| 国产欧美大片| 亚洲高清视频在线| 99这里只有精品| 性色av一区二区三区红粉影视| 久久久久久久波多野高潮日日| 免播放器亚洲| 亚洲国产三级在线| 极品日韩久久| 国模大胆一区二区三区| 免费观看不卡av| 亚洲免费在线精品一区| 久久精品国产综合| 亚洲福利在线看| 一本久久综合亚洲鲁鲁| 久久精品综合| 亚洲国产精品久久91精品| 久久成人精品一区二区三区| 欧美久色视频| 国产一区二区视频在线观看| 亚洲日本理论电影| 欧美在线电影| 男女激情久久| 亚洲人永久免费| 免费看成人av| 一区二区av在线| 久久亚洲综合| 国产精品自拍一区| 91久久精品视频| 久久9热精品视频| 99精品免费| 欧美成人精品影院| 欧美性事免费在线观看| 国产亚洲亚洲| 中文亚洲免费| 男同欧美伦乱| 亚洲视频第一页| 久热这里只精品99re8久| 国产欧美日韩一区二区三区| 亚洲一区国产一区| 亚洲免费精品| 国产日韩精品一区二区浪潮av| 香蕉成人久久| 欧美成人精品在线播放| 欧美大胆成人| 欧美一进一出视频| 国产精品福利影院| 在线一区欧美| 一区二区国产精品| 欧美日韩精品一区二区三区| 日韩视频免费大全中文字幕| 亚洲国产成人av在线| 美日韩在线观看| 亚洲黑丝在线| 亚洲国产高清一区二区三区| 欧美激情bt| 一本色道久久综合亚洲精品按摩 | 欧美在线视频在线播放完整版免费观看| 亚洲黑丝一区二区| 欧美不卡高清| 夜夜爽99久久国产综合精品女不卡| 欧美激情中文字幕在线| 欧美久久成人| 亚洲欧美另类在线观看| 亚洲综合首页| 国产专区欧美专区| 亚洲电影毛片| 欧美午夜免费| 欧美在线视频在线播放完整版免费观看| 香蕉av777xxx色综合一区| 国内精品国语自产拍在线观看| 免费欧美日韩| 欧美日韩另类视频| 欧美片第1页综合| 午夜精品视频在线| 欧美中在线观看| 亚洲日本aⅴ片在线观看香蕉| 亚洲黄色成人| 国产免费成人| 欧美国产日产韩国视频| 欧美视频在线观看视频极品| 欧美在线一级va免费观看| 久久蜜桃资源一区二区老牛| 亚洲毛片av| 午夜精品久久久久久久蜜桃app| 在线观看一区二区视频| 亚洲免费不卡| 国产日韩欧美麻豆| 亚洲国产高清在线| 国产婷婷色一区二区三区四区| 欧美成人午夜激情在线| 国产精品久久久一本精品| 老色鬼久久亚洲一区二区| 欧美大片一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美色区777第一页| 久久精品国内一区二区三区| 欧美激情中文字幕乱码免费| 久久精品在线| 国产精品播放| 亚洲国产精品123| 国产精品羞羞答答xxdd| 欧美激情欧美激情在线五月| 国产日产亚洲精品系列| 亚洲精品久久7777| 狠狠色伊人亚洲综合网站色| 欧美一区二区三区视频在线| 美女成人午夜| 久久久久久亚洲综合影院红桃 | 亚洲一区在线看| 欧美a级在线| 快射av在线播放一区| 国产精品视频大全| 亚洲最新色图| 亚洲小说欧美另类婷婷| 免播放器亚洲一区| 免费人成网站在线观看欧美高清| 国产精品久久久久久久久果冻传媒| 亚洲国产日韩一区| 亚洲精品国产品国语在线app| 久久国产精品网站| 欧美亚洲日本一区| 国产精品久久久久免费a∨| 日韩网站在线看片你懂的| 亚洲美女黄色| 欧美精品久久99| 亚洲欧洲日本国产| 日韩一级片网址| 一本一本久久a久久精品牛牛影视| 能在线观看的日韩av| 久久久欧美精品sm网站| 欧美sm极限捆绑bd| 欧美一区日本一区韩国一区| 亚洲欧美日本精品| 欧美午夜宅男影院在线观看| 99精品国产在热久久婷婷| 亚洲一区二区三区免费在线观看| 欧美日韩精品欧美日韩精品| 亚洲国产精品久久久| 夜夜嗨av色一区二区不卡| 欧美区日韩区| 一区二区三区四区国产| 欧美一区二区精品在线| 国产亚洲午夜| 农村妇女精品| 在线午夜精品| 久久男女视频| 亚洲经典视频在线观看| 欧美视频久久| 欧美专区第一页| 亚洲福利国产精品| 在线一区日本视频| 国产手机视频精品| 欧美激情按摩在线| 亚洲伊人观看| 欧美顶级艳妇交换群宴| 亚洲视频一区二区| 国产毛片精品国产一区二区三区| 久久久一二三| 日韩亚洲精品视频| 久久在线免费| 中文高清一区| 伊人精品视频| 国产精品久久久久久亚洲调教| 久久国产精品一区二区三区四区 | 一区国产精品| 欧美久久电影| 欧美一区二区三区日韩| 亚洲福利视频网站| 久久国产一区二区三区| 一区二区欧美激情| 红桃视频欧美| 国产精品hd| 久久免费视频在线| 亚洲综合精品| 亚洲精品乱码久久久久久黑人| 久久精品伊人| 性做久久久久久久免费看| 一本色道久久99精品综合 | 午夜欧美视频| 亚洲免费成人av电影| 免费在线亚洲欧美| 久久成人这里只有精品| 一区二区成人精品| 在线精品亚洲一区二区| 国产欧美日韩综合| 欧美性猛片xxxx免费看久爱| 欧美激情无毛| 欧美肥婆bbw| 美女视频网站黄色亚洲| 久久精品国产亚洲一区二区三区|