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

alpc60 ACM/ICPC程序設(shè)計
成長的路……源
posts - 20,comments - 42,trackbacks - 0
 

       Remmarguts' Date

Description

"Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he told them a story.

"Prince Remmarguts lives in his kingdom UDF – United Delta of Freedom. One day their neighboring country sent them Princess Uyuw on a diplomatic mission."

"Erenow, the princess sent Remmarguts a letter, informing him that she would come to the hall and hold commercial talks with UDF if and only if the prince go and meet her via the K-th shortest path. (in fact, Uyuw does not want to come at all)"

Being interested in the trade development and such a lovely girl, Prince Remmarguts really became enamored. He needs you - the prime minister's help!

DETAILS: UDF's capital consists of N stations. The hall is numbered S, while the station numbered T denotes prince' current place. M muddy directed sideways connect some of the stations. Remmarguts' path to welcome the princess might include the same station twice or more than twice, even it is the station with number S or T. Different paths with same length will be considered disparate.

Input

The first line contains two integer numbers N and M (1 <= N <= 1000, 0 <= M <= 100000). Stations are numbered from 1 to N. Each of the following M lines contains three integer numbers A, B and T (1 <= A, B <= N, 1 <= T <= 100). It shows that there is a directed sideway from A-th station to B-th station with time T.

The last line consists of three integer numbers S, T and K (1 <= S, T <= N, 1 <= K <= 1000).

Output

A single line consisting of a single integer number: the length (time required) to welcome Princess Uyuw using the K-th shortest path. If K-th shortest path does not exist, you should output "-1" (without quotes) instead.

Sample Input

2 2
1 2 5
2 1 4
1 2 2

Sample Output

14

Source

POJ Monthly,Zeyuan Zhu

 

       原來這就是傳說中的A*.第一次寫的A*,多多感謝alpc55推薦的這道好題。先說說原先讀到這到題目的想法,以前也聽講過k短路,我還以為就是多做幾次dijkstra,或是在dijkstra算法選邊的時候控制一些條件。聽alpc55說是用A*啟發(fā)式搜索,直接使用廣度優(yōu)先搜索會暴空間。當(dāng)時聽著也不怎么理解,就是把這些話記下來了。回來搞了兩天,也翻了些資料,終于把這個算法弄出來了。

       先說說啟發(fā)式搜索吧。通常在解決問題的時候,我們需要用到搜索算法,由已知狀態(tài)推出新的狀態(tài),然后檢驗新的狀態(tài)是不是就是我們要求的最優(yōu)解。檢驗完所有的狀態(tài)實際上就相當(dāng)于遍歷了一張隱式圖。遺憾的是,所有的狀態(tài)組成的狀態(tài)空間往往是成指數(shù)級別增長的,也就造成了遍歷需要用到指數(shù)級別的時間,因此,純粹的暴力搜索,時空效率都比較低。當(dāng)然,我們在生活中遇到了類似于搜索的問題,我們并不會盲目地去搜尋每一種狀態(tài),我們會通過我們的思維,選擇一條最接近于目標(biāo)的路徑或者是近似于最短的路徑去完成搜索任務(wù)。當(dāng)我們想要計算機去完成這樣一項搜索任務(wù)的時候,就得讓計算機像人一樣能夠區(qū)分盡量短的路徑,以便高效地找到最優(yōu)解。這時可以把計算機看作是一種智能體(agent)可以實現(xiàn)由初始狀態(tài)向目標(biāo)狀態(tài)的轉(zhuǎn)移。

       有一種貪心策略,即每一步轉(zhuǎn)移都由計算機選擇當(dāng)前的最優(yōu)解生成新的狀態(tài),一直到達目標(biāo)狀態(tài)為止。這樣做的時間效率雖然較高,但是貪心的策略只是用到了局部的最優(yōu)解,并不能保證最后到達目標(biāo)狀態(tài)得到的是全局最優(yōu)解。在能保證全局最優(yōu)解的范圍內(nèi),貪心算法還是很有用的。比如說我們熟知的Dijkstra算法求單源最短路。每次選擇距離源節(jié)點最短距離的待擴展節(jié)點進行擴展,最后就能生成源節(jié)點到所有節(jié)點的最短路徑。下面會講到Dijkstra的擴展,當(dāng)理解了這個算法之后,我想,你會對Dijkstra有更深入的理解。

       這就是A*算法。定義初始狀態(tài)S,目標(biāo)狀態(tài)tg(s)是由初始狀態(tài)轉(zhuǎn)移到當(dāng)前狀態(tài)s所經(jīng)過的路徑長度,h*(s)是當(dāng)前狀態(tài)s距離目標(biāo)狀態(tài)t的實際長度,但是一般情況下我們是不知道h*(s)的值的,所以還要定義一個估價函數(shù)h(s),是對h*(s)函數(shù)值的下界的估計,也就是有h(s)<=h*(s),這樣需要一個條件,使得由s1生成的每狀態(tài)s2,都有h(s1)<=h(s2),這是一個相容的估價函數(shù)。再定義f(s)=g(s)+h(s)為啟發(fā)函數(shù),因為h(s)是單調(diào)遞增的,所以f(s)也是單調(diào)遞增的。這樣f(s)就估計出了由初始狀態(tài)的總體代價。A*算法就通過構(gòu)造這樣一個啟發(fā)函數(shù),將所有的待擴展?fàn)顟B(tài)加入到隊列里,每次從隊列里選擇f(s)值最小的狀態(tài)進行擴展。由于啟發(fā)函數(shù)的作用,使得計算機在進行狀態(tài)轉(zhuǎn)移的時候盡量避開了不可能產(chǎn)生最優(yōu)解的分支,而選擇相對較接近最優(yōu)解的路徑進行搜索,提高了搜索效率。

       講到這里,可能已經(jīng)對A*算法的概念有點眉目了。下面我再來做一個比較,就用上面講到的Dijkstra的例子。Dijkstra算法說的是每次選擇距離源點最短距離的點進行擴展。當(dāng)然可以看做事先將源點到所有節(jié)點距離的值保存在一個優(yōu)先隊列里,每次從優(yōu)先隊列里出隊最短距離的點擴展,每個點的擴展涉及到要更新隊列里所有待擴展節(jié)點的距離值,每個節(jié)點只能進隊一次,就需要有一個表來記錄每個節(jié)點的入隊次數(shù)(就是算法中用到的標(biāo)記數(shù)組)。將Dijkstra求最短路的方法擴展,這道題目要求的是兩點間第k短路。類比于Dijkstra算法可以首先確定下面幾個搜索策略:

1、用優(yōu)先隊列保存節(jié)點進行搜索。

2、放開每個節(jié)點的入隊次數(shù),求k短路,每個節(jié)點可以入隊k次。

首先看第一個策略,在A*算法中用優(yōu)先隊列就是要用到啟發(fā)函數(shù)f(s)確定狀態(tài)在優(yōu)先隊列里面的優(yōu)先級。其實Dijkstra用到的優(yōu)先隊列實際上就是估價函數(shù)值為0,啟發(fā)函數(shù)f(s)=g(s),即是選取到源點距離最近的點進行擴展。因為h(s)=0滿足了估價函數(shù)相容這個條件。這題求k短路就不能單純的使用h(s)=0這個估價函數(shù)。解決這道題的時候選取h(x)=dt(x), dt(x)x節(jié)點到目標(biāo)節(jié)點的最短距離。最短距離可以開始由Dijkstra直接求得。

再看第二個策略,控制每個節(jié)點的入隊(或出隊)次數(shù)為k次,可以找到第k短路徑。可能這樣想有點主觀的套用,那么我就先來證明這樣一個結(jié)論:

如果xst的第k短路徑上的一個節(jié)點,那么由這條路徑sxsx的第m短路徑,則不可能有m>k。用反證法很容易得出:如果這條路徑是sx的第m短路徑,如果m>k,那么經(jīng)過xt的路徑就有m-1條比當(dāng)前路徑要短,不符合當(dāng)前路徑是st的第k短路徑。

  1#include <stdio.h>
  2#include <string.h>
  3#include <vector>
  4using namespace std;
  5
  6const int INF=1234567890;
  7struct P
  8{
  9    int x,len;
 10}
heap[1000005];
 11int size,n,m,dist[1005],s,t,ti,out[1005];
 12vector<struct P> g[1005],r[1005]; //有重邊的情況
 13
 14void Insert(int v);
 15struct P Del();
 16void dijkstra();
 17int Astar();
 18
 19int main()
 20{
 21    int i,a,b,L;
 22    struct P temp;
 23//    freopen("2449.txt","r",stdin);
 24    scanf("%d%d",&n,&m);
 25    for(i=0; i<m; i++)
 26    {
 27        scanf("%d%d%d",&a,&b,&L);
 28        temp.len=L;
 29        temp.x=b;
 30        g[a].push_back(temp);
 31        temp.len=L;
 32        temp.x=a;
 33        r[b].push_back(temp);
 34    }

 35    scanf("%d%d%d",&s,&t,&ti);
 36    if(s == t) ti++;
 37    printf("%d\n",Astar());
 38    return 0;
 39}

 40void dijkstra()
 41{
 42    int i,u,min;
 43    bool mark[1005]={false};
 44    vector<struct P>::iterator iter;
 45    for(i=1; i<=n; i++)
 46        dist[i]=INF;
 47    dist[t]=0;
 48    while(1)
 49    {
 50        u=-1;
 51        min=INF;
 52        for(i=1; i<=n; i++)
 53        {
 54            if(!mark[i] && dist[i] < min)
 55            {
 56                min=dist[i];
 57                u=i;
 58            }

 59        }

 60        if(u == -1break;
 61        mark[u]=true;
 62        for(iter=r[u].begin(); iter!=r[u].end(); iter++)
 63        {
 64            if(!mark[(*iter).x] && dist[(*iter).x] > dist[u]+(*iter).len)
 65                dist[(*iter).x]=dist[u]+(*iter).len;
 66        }

 67    }

 68}

 69void Insert(struct P v)
 70{
 71    int i;
 72    heap[size++]=v;
 73    i=size-1;
 74    while(i > 0)
 75    {
 76        if(v.len < heap[(i-1)/2].len)
 77        {
 78            heap[i]=heap[(i-1)/2];
 79            i=(i-1)/2;
 80        }

 81        else
 82            break;
 83    }

 84    heap[i]=v;
 85}

 86struct P Del()
 87{
 88    struct P r,temp;
 89    int i=0,ic;
 90    r=heap[0];
 91    heap[0]=heap[--size];
 92    temp=heap[0];
 93    while(2*i+1 < size)
 94    {
 95        ic=2*i+1;
 96        while(ic+1 < size && heap[ic+1].len < heap[ic].len)
 97            ic++;
 98        if(heap[ic].len < temp.len)
 99        {
100            heap[i]=heap[ic];
101            i=ic;
102        }

103        else break;
104    }

105    heap[i]=temp;
106    return r;
107}

108int Astar()
109{
110    int ds;
111    struct P v,temp;
112    vector<struct P>::iterator iter;
113    size=0;
114    dijkstra();
115    v.x=s;
116    v.len=dist[s];
117    Insert(v);
118    memset(out,0,sizeof(out));
119    while(size > 0 && out[t] < ti)
120    {
121        v=Del();
122        if(out[v.x] >= ti)
123            continue;
124        out[v.x]++;
125        if(v.x == t && out[v.x] == ti)
126        {
127            return v.len;
128        }

129        for(iter=g[v.x].begin(); iter!=g[v.x].end(); iter++)
130        {
131            if(out[(*iter).x] >= ti)
132                continue;
133            ds=v.len-dist[v.x];
134            temp.len=ds+(*iter).len+dist[(*iter).x];
135            temp.x=(*iter).x;
136            Insert(temp);
137        }

138    }

139    return -1;
140}

141
142
posted on 2008-04-20 15:25 飛飛 閱讀(3014) 評論(6)  編輯 收藏 引用 所屬分類: ACM/ICPC

FeedBack:
# re: A*搜索求最短路
2008-07-26 12:27 | QQ:270428513
for(iter=g[v.x].begin(); iter!=g[v.x].end(); iter++)
{

}
最關(guān)鍵部分怎么沒寫了啊  回復(fù)  更多評論
  
# re: A*搜索求最短路
2008-07-28 11:19 | 飛飛
貼的時候不小心弄丟了……  回復(fù)  更多評論
  
# re: A*搜索求最短路
2008-08-01 16:09 | Adam
很強大!不過我個人認(rèn)為用下標(biāo)比迭代器用起來更清晰。  回復(fù)  更多評論
  
# re: A*搜索求最短路
2008-08-02 11:20 | 飛飛
也是,當(dāng)時還屬于初學(xué)狀態(tài)。  回復(fù)  更多評論
  
# re: A*搜索求最短路
2009-05-07 10:08 | pandy
所以還要定義一個估價函數(shù)h(s),是對h*(s)函數(shù)值的下界的估計,也就是有h(s)<=h*(s),這樣需要一個條件,使得由s1生成的每狀態(tài)s2,都有h(s1)<=h(s2),這是一個相容的估價函數(shù)。

這一段怎么理解??  回復(fù)  更多評論
  
# re: A*搜索求最短路
2010-08-05 23:10 | MJ
“使得由s1生成的每狀態(tài)s2,都有h(s1)<=h(s2)”應(yīng)該是“都有h(s1)<=h(s2)+c(s1,s2)”吧  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲成人在线视频播放| 欧美婷婷在线| 99av国产精品欲麻豆| 亚洲高清免费视频| 免费欧美在线视频| 欧美国产成人在线| 亚洲日本中文| 亚洲午夜久久久久久尤物| 亚洲综合清纯丝袜自拍| 亚洲一区在线观看视频| 欧美亚洲免费高清在线观看| 久久精品视频va| 欧美大胆人体视频| 国产精品国产自产拍高清av王其| 国产精品色午夜在线观看| 欧美日韩色一区| 激情久久久久| 最新国产精品拍自在线播放| 亚洲美女淫视频| 亚洲女性喷水在线观看一区| 欧美在线网址| 免费日韩av| 亚洲视频欧洲视频| 久久亚洲私人国产精品va| 欧美极品aⅴ影院| 国产伦精品一区二区三区照片91 | 欧美国产欧美亚洲国产日韩mv天天看完整 | 欧美日本国产视频| 国产精品入口日韩视频大尺度| 狠狠色丁香久久综合频道| 一级成人国产| 久久综合影音| 亚洲免费视频成人| 欧美精品v日韩精品v国产精品| 国产欧美日本在线| 一区二区三区日韩欧美精品| 久久综合综合久久综合| 亚洲特级片在线| 欧美激情精品久久久| 国产一区二区激情| 亚洲欧美日韩在线观看a三区| 欧美激情按摩| 久久久久久国产精品mv| 国产精品免费网站| 中文精品99久久国产香蕉| 欧美福利一区二区三区| 久久黄色影院| 国产一区二区| 久久精品一区中文字幕| 亚洲免费一级电影| 国产精品久久国产愉拍| 一区二区三区欧美激情| 亚洲国产婷婷综合在线精品| 久久综合九色综合欧美狠狠| 国产日韩精品一区二区浪潮av| 99亚洲一区二区| 日韩视频免费观看高清在线视频| 欧美暴力喷水在线| 亚洲激情不卡| 亚洲国产免费| 欧美精品日韩www.p站| 亚洲国产欧美一区| 欧美成人一区二区| 女主播福利一区| 亚洲欧洲在线播放| 欧美激情一区二区三区成人| 老司机午夜免费精品视频| 久久国产88| 欧美在线视频日韩| 国产欧美日韩精品丝袜高跟鞋| 午夜精品免费视频| 亚洲一品av免费观看| 国产精品久久久久久av福利软件 | 亚洲精品欧美日韩专区| 欧美国产精品日韩| 夜夜嗨av一区二区三区中文字幕| 亚洲国产日韩欧美综合久久 | 蜜臀av一级做a爰片久久 | 亚洲福利在线观看| 亚洲国产一区二区三区在线播 | 黄色成人av网站| 欧美二区不卡| 欧美视频不卡| 欧美在线观看一二区| 欧美亚洲自偷自偷| 亚洲国语精品自产拍在线观看| 亚洲日韩中文字幕在线播放| 欧美日韩一区精品| 久久久精品五月天| 欧美福利电影网| 午夜精品久久久久久久久| 久久精品国产免费观看| 亚洲精品免费在线观看| 亚洲性感激情| 91久久国产综合久久91精品网站| 亚洲免费电影在线观看| 国产亚洲成av人在线观看导航 | 亚洲欧美日韩一区二区三区在线| 久久精品国产一区二区三区免费看| 亚洲黄色精品| 亚洲综合视频网| 亚洲日本视频| 欧美伊人精品成人久久综合97| 亚洲欧洲一区二区三区在线观看 | 欧美日本国产在线| 久久久久久久999| 欧美日韩不卡视频| 美女黄色成人网| 国产精品一区二区久久国产| 亚洲国产精品久久久久| 国产亚洲精品一区二555| 日韩视频―中文字幕| 亚洲大片av| 欧美在线免费观看视频| 一区二区三区四区国产| 久久天堂成人| 久久精品中文字幕免费mv| 欧美日韩一区精品| 欧美激情精品久久久久久蜜臀| 亚洲精品在线一区二区| 国产精品久久久亚洲一区| 欧美在线亚洲一区| 欧美成ee人免费视频| 欧美在线免费| 欧美日韩黄色大片| 免费观看国产成人| 国产欧美一区二区三区在线老狼| 亚洲日韩视频| 亚洲乱亚洲高清| 永久91嫩草亚洲精品人人| 亚洲一区二区三区成人在线视频精品| 伊人夜夜躁av伊人久久| 亚洲综合国产精品| 亚洲网站视频| 欧美—级a级欧美特级ar全黄| 免费久久99精品国产| 国产日韩欧美精品一区| 亚洲影视中文字幕| 亚洲欧美在线磁力| 欧美亚韩一区| 亚洲午夜视频在线观看| 亚洲欧美视频一区二区三区| 欧美视频在线观看一区| 激情成人在线视频| 久久精品在线观看| 美女网站在线免费欧美精品| 一区二区亚洲欧洲国产日韩| 久久av最新网址| 久久综合九色综合欧美就去吻| 国产综合欧美| 狼人社综合社区| 最近中文字幕mv在线一区二区三区四区 | 亚洲免费影视| 国产欧美日韩一区二区三区在线| 亚洲欧美日韩一区二区在线 | 国产精品免费aⅴ片在线观看| 中日韩午夜理伦电影免费| 亚洲一区二区三区免费视频 | 欲色影视综合吧| 欧美成人高清视频| 一区二区三区.www| 久久亚洲国产精品日日av夜夜| 激情欧美一区二区三区在线观看| 麻豆精品视频在线| 一区二区三区精品国产| 久久精品首页| 日韩视频在线一区| 国产精品视屏| 欧美激情一区二区三区| 亚洲一区观看| 亚洲国产精品一区在线观看不卡 | 亚洲视频精品| 久久另类ts人妖一区二区 | 久久精品视频网| 日韩写真视频在线观看| 国产欧美一区二区精品仙草咪| 久久深夜福利免费观看| 一个色综合导航| 美女黄色成人网| 亚洲欧美韩国| 亚洲国产精品美女| 国产精品视屏| 欧美日本精品一区二区三区| 欧美一区二区三区免费看| 亚洲精品欧美日韩| 女人天堂亚洲aⅴ在线观看| 性8sex亚洲区入口| 日韩视频在线免费观看| 国模大胆一区二区三区| 欧美午夜电影一区| 欧美成人免费全部| 欧美一区二区在线免费播放| 日韩网站免费观看| 欧美激情2020午夜免费观看| 久久精品一区二区三区不卡| 亚洲一区在线看| 在线亚洲一区| 99精品热视频| 日韩亚洲欧美高清| 亚洲欧洲三级电影|