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

[SCOI2007 kshort]
求圖的s-t第K短簡(jiǎn)單路問題,若有長(zhǎng)度相同的,字典序小的優(yōu)先。

首先,由于是簡(jiǎn)單路,所以A*是不能做的,因?yàn)橛锌赡苡袃蓷ls-i(i為某個(gè)中間點(diǎn))路P1和P2,P1比P2短,但由于P1到達(dá)的頂點(diǎn)與P2不同,導(dǎo)致最終沿P1到達(dá)t的路徑長(zhǎng)度長(zhǎng)于沿P2到達(dá)t的(甚至有可能沿P1根本到不了t)。然后,如果直接用DFS,由于要求的是第K優(yōu)解,而不是最優(yōu)解,所以不能使用最優(yōu)性剪枝(包括分支限界),因此專門為最優(yōu)性剪枝服務(wù)的“改變搜索順序”技巧也不能使用了,因此,能夠使用的只有可行性剪枝,而本題的數(shù)據(jù)范圍使得這種算法必然TLE。

正解是一種由迭代加深思想擴(kuò)展得到的“迭代變優(yōu)”DFS。設(shè)置一個(gè)路徑長(zhǎng)度上限Z,搜索s到t的所有簡(jiǎn)單路,在搜索過(guò)程中,遇到長(zhǎng)度大于Z的路徑就停止(剪枝),然后,若得到路徑不足K條,則增加Z的值,重新開始搜索,直到得到的路徑總數(shù)大于等于K條為止。這里可以進(jìn)行啟發(fā)式的優(yōu)化,設(shè)g[i]為點(diǎn)i到t的最短路長(zhǎng)度,則搜索過(guò)程中,假設(shè)目前搜到點(diǎn)i,則(目前路徑長(zhǎng)度+g[i])是對(duì)整條路徑最短長(zhǎng)度的樂觀估計(jì),如果這個(gè)值超過(guò)了Z,就可以剪枝,但在剪枝之前要記下這個(gè)超過(guò)了Z的啟發(fā)值,取其中最小的作為下一次迭代的Z值。那么對(duì)于字典序腫么辦?可以在搜索過(guò)程中,強(qiáng)制先搜編號(hào)小的結(jié)點(diǎn),這樣得到的s-t路徑必然是字典序遞增的。另外只要求出第K條路徑,搜索就可以終止,因?yàn)槿菀鬃C明,題目要求的第K短的路徑一定已經(jīng)求出來(lái)了(只不過(guò)不一定是最后一條而已),找到即可。此外,在搜索過(guò)程中不要忘了可行性剪枝,就是如果沿目前搜到的路徑已經(jīng)到不了t了,剪枝。

“迭代變優(yōu)”DFS,就是設(shè)置一個(gè)解的評(píng)價(jià)值的上限(最小值)或下限(最大值),在搜索過(guò)程中,如果實(shí)際評(píng)價(jià)值(或者啟發(fā)值,如果可以加啟發(fā)式優(yōu)化的話)越過(guò)這個(gè)限制,則剪枝。在一次搜索后,如果沒有得到符合要求的解,就將該限制值設(shè)為本次搜索過(guò)程中越界“越”得最近的那個(gè)值,重新開始搜索,直到找到所需要的解或者發(fā)現(xiàn)無(wú)解(如果一次搜索中沒有發(fā)生越界,卻仍然沒有找到解)為止。其應(yīng)用主要體現(xiàn)在兩個(gè)方面:(1)搜索樹過(guò)深甚至無(wú)限深,但所需求的那個(gè)解卻不深的情況;(2)求第K優(yōu)解的情況。

代碼:
#include <iostream>
#include 
<stdio.h>
#include 
<stdlib.h>
#include 
<string.h>
#include 
<algorithm>
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 rre(i, n) for (int i=n-1; i>=0; i--)
#define rre1(i, n) for (int i=n; i>0; i--)
#define rre2(i, r, l) for (int i=r-1; i>=l; i--)
#define rre3(i, r, l) for (int i=r; i>=l; i--)
const int MAXN = 51, MAXK = 201, MAXM = 3000, INF = ~0U >> 2;
struct edge {
    
int a, b, w, pre, next;
} E[MAXM 
+ MAXN], E0[MAXM + MAXN];
struct edge0 {
    
int a, b, w;
    
bool operator< (edge0 e0) const {return b < e0.b;}
} _E[MAXM];
int n, m, s, t, K, dist[MAXN], Q[MAXN + 1];
int Z, Z0, vst0[MAXN], _FL, len0, X00[MAXN], No, len[MAXK], X0[MAXK][MAXN], sum0[MAXK], reslen, res[MAXN];
bool vst[MAXN], res_ex = 0;
void init_d()
{
    re(i, n) E[i].pre 
= E[i].next = E0[i].pre = E0[i].next = i; m = n;
}
void add_edge(int a, int b, int w)
{
    E[m].a 
= a; E[m].b = b; E[m].w = w; E[m].pre = E[a].pre; E[m].next = a; E[a].pre = m; E[E[m].pre].next = m;
    E0[m].a 
= b; E0[m].b = a; E0[m].w = w; E0[m].pre = E0[b].pre; E0[m].next = b; E0[b].pre = m; E0[E0[m].pre].next = m++;
}
void init()
{
    
int m0; scanf("%d%d%d%d%d"&n, &m0, &K, &s, &t); init_d(); s--; t--;
    re(i, m0) {scanf(
"%d%d%d"&_E[i].a, &_E[i].b, &_E[i].w); _E[i].a--; _E[i].b--;}
    sort(_E, _E 
+ m0);
    re(i, m0) add_edge(_E[i].a, _E[i].b, _E[i].w);
}
void prepare()
{
    re(i, n) {vst[i] 
= 0; dist[i] = INF;} vst[t] = 1; dist[t] = 0; Q[0= t;
    
int x, y, d0, d1;
    
for (int front=0, rear=0!(!front && rear==|| front==rear+1); front==? front=0 : front++) {
        x 
= Q[front]; d0 = dist[x];
        
for (int p=E0[x].next; p != x; p=E0[p].next) {
            y 
= E0[p].b; d1 = d0 + E0[p].w;
            
if (d1 < dist[y]) {
                dist[y] 
= d1;
                
if (!vst[y]) {vst[y] = 1; Q[rear==? rear=0 : ++rear] = y;}
            }
        }
        vst[x] 
= 0;
    }
}
void dfs(int x, int sum)
{
    
if (x == t) {
        
if (sum <= Z) {sum0[No] = sum; len[No] = len0; re(i, len0) X0[No][i] = X00[i]; No++if (No == K) res_ex = 1;}
        
else if (sum < Z0) Z0 = sum;
        
return;
    } 
else {
        
int h0 = sum + dist[x];
        
if (h0 > Z) {if (h0 < Z0) Z0 = h0; return;}
        vst0[x] 
= ++_FL; Q[0= x; int _x, _y;
        
for (int front=0, rear=0; front<=rear; front++) {
            _x 
= Q[front];
            
for (int p=E[_x].next; p != _x; p=E[p].next) {
                _y 
= E[p].b;
                
if (!vst[_y] && vst0[_y] != _FL) {vst0[_y] = _FL; Q[++rear] = _y;}
            }
        }
        
if (vst0[t] != _FL) return;
        
for (int p=E[x].next; p != x; p=E[p].next) {
            _y 
= E[p].b;
            
if (!vst[_y]) {vst[_y] = 1; X00[len0++= _y; dfs(_y, sum + E[p].w); if (res_ex) returnelse {len0--; vst[_y] = 0;}}
        }
    }
}
void solve()
{
    Z 
= dist[s]; int No0 = 0; _FL = 0;
    
while (1) {
        Z0 
= INF; No = 0; re(i, n) {vst[i] = 0; vst0[i] = 0;}
        vst[s] 
= 1; len0 = 1; X00[0= s; dfs(s, 0);
        
if (res_ex) {
            No0 
= K - No0;
            re(i, K) 
if (sum0[i] == Z) {No0--if (!No0) {reslen = len[i]; re(j, len[i]) res[j] = X0[i][j];}}
            
break;
        } 
else if (Z0 == INF) breakelse {No0 = No; Z = Z0;}
    }
}
void pri()
{
    
if (res_ex) {
        printf(
"%d", res[0+ 1);
        re2(i, 
1, reslen) printf("-%d", res[i] + 1);
        puts(
"");
    } 
else puts("No");
}
int main()
{
    init();
    prepare();
    solve();
    pri();
    
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>
            噜噜噜在线观看免费视频日韩| 亚洲成人原创| 国产精品视频大全| 亚洲国产精品成人综合色在线婷婷| 欧美成人亚洲成人| 女人香蕉久久**毛片精品| 黄色一区二区在线观看| 亚洲毛片av在线| 欧美aa在线视频| 久久一区二区三区四区| 欧美国产日韩视频| 久久精品国产在热久久| 亚洲精品在线观| 久久综合网hezyo| 久久精品国产精品亚洲综合 | 亚洲欧洲综合另类在线| 噜噜噜久久亚洲精品国产品小说| 欧美激情视频在线免费观看 欧美视频免费一 | 亚洲无亚洲人成网站77777| 在线播放日韩| 国产精品成人国产乱一区| 国产精品一香蕉国产线看观看| 国产精品a久久久久| 亚洲免费视频观看| 亚洲裸体俱乐部裸体舞表演av| 国产一区二区三区免费观看| 91久久精品国产91性色tv| 欧美激情精品久久久久久蜜臀 | 国产精品美女www爽爽爽视频| 欧美日韩在线免费观看| 中日韩午夜理伦电影免费| 亚洲精品在线电影| 99re成人精品视频| 欧美天天综合网| 国产精品久久久久一区| 国产精品综合色区在线观看| 国产一区二区| 亚洲伦理久久| 欧美淫片网站| 国外成人在线视频| 国产精品久久久久久久一区探花| 国产精品尤物| 久久久国产91| 欧美另类99xxxxx| 国产精品视频自拍| 精品96久久久久久中文字幕无| 亚洲第一色在线| 亚洲综合国产| 亚洲福利在线看| 亚洲精品三级| 欧美成人高清视频| 国产日韩欧美在线播放不卡| 亚洲国产老妈| 国产精品久久久久免费a∨大胸| 国产一区二区三区日韩欧美| 亚洲韩国日本中文字幕| 午夜一区二区三视频在线观看| 欧美sm视频| 亚洲午夜三级在线| 欧美国产日韩一区二区在线观看 | 欧美日韩精品免费在线观看视频| 国产婷婷色一区二区三区在线| 亚洲国产欧美精品| 亚洲欧美精品在线| 亚洲午夜av在线| 日韩图片一区| 久久久久久久久一区二区| 99精品视频一区| 欧美激情精品久久久久久变态| 欧美体内she精视频在线观看| 亚洲国内在线| 久久综合精品国产一区二区三区| 美女尤物久久精品| 国产亚洲美州欧州综合国| 日韩一级视频免费观看在线| 亚洲一区二区精品| 亚洲第一综合天堂另类专| 午夜日韩在线| 性做久久久久久久免费看| 欧美日韩美女| 亚洲免费电影在线观看| 亚洲国产激情| 麻豆精品视频在线观看视频| 国产日韩欧美三区| 欧美一区二区精品在线| 亚洲一本视频| 国产精品伦一区| 亚洲一区欧美二区| 这里是久久伊人| 国产精品a久久久久久| 好吊一区二区三区| 亚洲美女性视频| 欧美成人免费网| 美女网站久久| 99这里只有精品| 99综合精品| 国产精品免费观看在线| 销魂美女一区二区三区视频在线| 亚洲亚洲精品在线观看| 国产麻豆精品久久一二三| 性亚洲最疯狂xxxx高清| 午夜日韩av| 国产手机视频一区二区| 亚洲无线视频| 一区二区日韩精品| 国产美女扒开尿口久久久| 久久爱www久久做| 久久丁香综合五月国产三级网站| 老司机午夜精品视频在线观看| 樱桃成人精品视频在线播放| 欧美国产欧美亚州国产日韩mv天天看完整| 久久综合色8888| 亚洲视频专区在线| 午夜在线精品| 91久久久亚洲精品| 亚洲婷婷国产精品电影人久久| 国产精品夜夜嗨| 欧美+日本+国产+在线a∨观看| 亚洲免费人成在线视频观看| 美女脱光内衣内裤视频久久影院 | 久久狠狠亚洲综合| 男人的天堂亚洲在线| 亚洲女女女同性video| 亚洲精品视频免费| 国产精品久久久久久久9999| 欧美va天堂| 国产精品永久免费| 亚洲国产一区在线| 国内精品99| 日韩午夜av电影| 久久精品国产欧美激情| 久久夜色精品亚洲噜噜国产mv| 亚洲天堂成人在线观看| 亚洲精品视频一区| 亚洲精选在线| 久久久久9999亚洲精品| 亚洲欧美国产精品桃花| 欧美精品精品一区| 免费观看久久久4p| 国产午夜精品理论片a级大结局| 亚洲第一黄网| 黄色精品一区二区| 亚洲男人第一av网站| 一区二区三区导航| 日韩小视频在线观看专区| 亚洲欧美自拍偷拍| 一区二区三区日韩在线观看| 亚洲天堂av在线免费| 黑人中文字幕一区二区三区| 亚洲私拍自拍| 亚洲视频成人| 欧美精选午夜久久久乱码6080| 久久九九热免费视频| 国产精品一区二区a| 一本久久精品一区二区| av成人福利| 欧美激情在线| 亚洲国产美女精品久久久久∴| 黄色一区二区在线| 久久久免费观看视频| 亚洲午夜av在线| 麻豆91精品91久久久的内涵| 免费日韩av片| 亚洲青涩在线| 久久久久久久综合| 毛片一区二区三区| 亚洲黑丝一区二区| 麻豆精品一区二区av白丝在线| 久久综合给合久久狠狠色 | 亚洲国产成人午夜在线一区 | 欧美一区二区三区播放老司机| 欧美在线精品免播放器视频| 国产精品日韩久久久久| 亚洲丝袜av一区| 久久久91精品国产| 国产一区二区福利| 久久久久久穴| 欧美高清视频| 日韩视频免费在线观看| 久久精品午夜| 亚洲国产一区二区三区青草影视 | 国产精品视频内| 欧美在线视屏| 欧美成人精品一区二区| 亚洲欧洲精品一区二区| 欧美日韩国产一中文字不卡| 99re热精品| 久久精品亚洲乱码伦伦中文| 一区二区日韩精品| 国产亚洲精品自拍| 欧美日韩一区二区三区免费看| 一本色道久久加勒比88综合| 国产三级欧美三级日产三级99| 欧美精品系列| 久久久精彩视频| 亚洲一区视频在线观看视频| 亚洲电影免费观看高清完整版| 久久久久国产一区二区| 亚洲欧美日韩国产中文| 日韩天堂在线视频|