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

posts - 7,comments - 3,trackbacks - 0
Remmarguts' Date
Time Limit: 4000MSMemory Limit: 65536K
Total Submissions: 12450Accepted: 3422

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


第K短路問題,大概意思就是給你N個點,M條邊,邊是有向的,給你每條邊的邊權,給你一個S起始點,T結束點,和一個K,求S到T的第K短路。
SPFA+A*啟發式搜索。

說說啟發式搜索吧:

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

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

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

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

1、用優先隊列保存節點進行搜索。

2、放開每個節點的入隊次數,求k短路,每個節點可以入隊k次。

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

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

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

代碼:

#include <cstdio>
#include 
<algorithm>
#include 
<queue>
#include 
<vector>
#include 
<cstring>
#define MAXN 10005 //邊數
#define inf 1 << 25
using namespace std;

int dis[MAXN];

struct node
{
    
int v, dis;
};

struct edge
{
    
int v, w;
    friend 
bool operator < (edge a, edge b)
    {
        
return (a.w + dis[a.v]) > (b.w + dis[b.v]);
    }
};

vector 
<node> map[MAXN];
vector 
<node> remap[MAXN];

int n, m; //n是節點數,m是邊數。
int s, t, k;  //s是起始點,t是結束點,k是第k小。

void init()
{
    
int i;
    
for (i = 0; i < MAXN; ++i)
        map[i].clear();
    
for (i = 0; i < MAXN; ++i)
        remap[i].clear();
}

void spfa(int s)
{
    
int i;
    
bool used[MAXN];
    memset(used, 
0sizeof(used));
    
for (i = 0; i < MAXN; ++i)
        dis[i] 
= inf;
    dis[s] 
= 0;
    used[s] 
= true;
    queue 
<int> q;
    q.push(s);
    
while (!q.empty())
    {
        
int u = q.front();
        q.pop();
        used[u] 
= false;
        
for (i = 0; i < remap[u].size(); ++i)
        {
            node p 
= remap[u][i];
            
if (dis[p.v] > dis[u] + p.dis)
            {
                dis[p.v] 
= dis[u] + p.dis;
                
if (!used[p.v])
                {
                    used[p.v] 
= true;
                    q.push(p.v);
                }
            }
        }
    }
}

int a_star()
{
    
if (s == t)
        k
++;   //注意,起始和結束一樣,k要+1;
    if (dis[s] == inf)
        
return -1;
    
int i, x, len, cnt[MAXN];
    edge n1, n2;
    priority_queue 
<edge> q;
    memset(cnt, 
0sizeof(cnt));
    n1.v 
= s;
    n1.w 
= 0;
    q.push(n1);
    
while (!q.empty())
    {
        n2 
= q.top();
        q.pop();
        x 
= n2.v;
        len 
= n2.w;
        cnt[x]
++;
        
if (cnt[t] == k)
            
return len;
        
if (cnt[x] > k)
            
continue;
        
for (i = 0; i < map[n2.v].size(); ++i)
        {
            n1.v 
= map[n2.v][i].v;
            n1.w 
= len + map[n2.v][i].dis;
            q.push(n1);
        }
    }
    
return -1;
}

int main()
{
    
int i;
    node p;
    
while (scanf("%d%d"&n, &m) != EOF)
    {
        init();
        
int a, b, l;
        
for (i = 1; i <= m; ++i)
        {
            scanf(
"%d%d%d"&a, &b, &l);
            p.v 
= b;
            p.dis 
= l;
            map[a].push_back(p);
            p.v 
= a;
            remap[b].push_back(p);
        }
        scanf(
"%d%d%d"&s, &t, &k);
        spfa(t);
        
int ans = a_star();
        printf(
"%d\n", ans);
    }
    
return 0;
}
posted on 2011-10-17 15:19 LLawliet 閱讀(693) 評論(0)  編輯 收藏 引用 所屬分類: 圖論

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合伊人| 一本色道久久综合亚洲精品婷婷| 亚洲一区二区三区精品视频 | 欧美日韩成人综合| 国产精品一区二区男女羞羞无遮挡| 国产精品一区二区你懂的| 99视频在线观看一区三区| 久久夜色精品| 亚洲性xxxx| 欧美日韩国产黄| 亚洲国产毛片完整版| 久久国产日韩欧美| 亚洲永久免费av| 欧美日韩亚洲一区三区| 国产精品成人在线| 亚洲欧美一区二区精品久久久| 另类激情亚洲| 久久在线精品| 国产一区二三区| 欧美一级免费视频| 午夜欧美理论片| 国产精品网红福利| 日韩一级片网址| 久久久久久香蕉网| 亚洲一区观看| 国产欧美日韩精品在线| 国产精品亚洲片夜色在线| 亚洲精品一品区二品区三品区| 久久精品国产第一区二区三区| 久久久久久夜| 欧美不卡在线| 久久中文字幕导航| 国产综合激情| 性亚洲最疯狂xxxx高清| 欧美一级免费视频| 国产视频丨精品|在线观看| 亚洲自拍偷拍麻豆| 亚洲婷婷综合久久一本伊一区| 欧美日韩在线播| 亚洲午夜小视频| 一本到12不卡视频在线dvd| 欧美另类视频在线| 在线午夜精品自拍| 在线亚洲伦理| 国产毛片精品视频| 久久免费视频在线观看| 久久精品女人天堂| 国产精品亚洲成人| 老司机精品福利视频| 久久天堂av综合合色| 亚洲毛片视频| 夜夜爽www精品| 国产精品视频久久一区| 久久影音先锋| 欧美激情第六页| 亚洲综合日韩| 老鸭窝91久久精品色噜噜导演| 亚洲国产精品精华液2区45| 亚洲欧洲在线视频| 欧美日韩精品免费观看视频完整 | 亚洲乱码一区二区| 一区二区高清在线观看| 国产一区二区精品在线观看| 免费成人在线视频网站| 欧美一区二区三区在线免费观看| 欧美三级韩国三级日本三斤| 欧美一区二区在线免费播放| 久久久.com| 亚洲午夜伦理| 久久国产精彩视频| 一本久久a久久免费精品不卡 | 午夜精品福利电影| 国产精品久久久久久久免费软件| 久久成人免费日本黄色| 免费亚洲电影在线观看| 欧美国产视频日韩| 在线看片第一页欧美| 亚洲一区二区在线视频| av成人免费观看| 欧美精品一区二区久久婷婷| 麻豆精品视频| 日韩一级在线观看| 在线亚洲电影| 国产日韩欧美在线| 亚洲四色影视在线观看| 午夜精品亚洲一区二区三区嫩草| 日韩一区二区精品| 欧美激情一区二区久久久| 噜噜噜噜噜久久久久久91 | 欧美精品日韩精品| 亚洲欧美国产视频| 欧美人与性动交a欧美精品| 久久另类ts人妖一区二区 | 亚洲免费在线看| 欧美在线视频播放| 国产精品久久久久一区二区三区共 | 欧美亚洲网站| 国产精品久久久久一区二区三区| 午夜精品电影| 欧美福利一区二区| 亚洲欧美日韩综合| 亚洲一区二区三区四区五区黄| 欧美日韩久久不卡| 久久最新视频| 欧美在线观看视频| 午夜欧美理论片| 老司机午夜精品视频在线观看| 欧美日韩中文字幕在线| 亚洲日本欧美| 蜜桃久久av一区| 欧美一区二区免费| 亚洲乱码国产乱码精品精天堂| 亚洲精品久久7777| 久久影院亚洲| 裸体歌舞表演一区二区| aaa亚洲精品一二三区| 欧美在线免费视屏| 国产亚洲精品一区二555| 欧美激情一区二区三区在线| 久久久精品国产免大香伊 | 久久精品99| 日韩天天综合| 欧美国产精品中文字幕| 欧美怡红院视频一区二区三区| 亚洲视频免费在线观看| 国产精品va在线播放我和闺蜜| 亚洲美女黄色| 国产欧美日韩亚洲| 久久精品久久99精品久久| 免费不卡在线观看| 亚洲伦理一区| 国产精品v欧美精品∨日韩| 一本久道久久综合中文字幕| 久久精品国内一区二区三区| 黄色成人片子| 久久国产88| 亚洲国产精品一区二区第四页av | 亚洲国产三级| 久久久国产精品亚洲一区| 亚洲国产影院| 亚洲免费观看在线观看| 久久久久久有精品国产| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲精品一区中文| 性色av一区二区三区红粉影视| 欧美在线free| 欧美xx视频| 亚洲一区二区在线播放| 久久久亚洲精品一区二区三区| 欧美精品在线一区| 国产精品xxxxx| 日韩性生活视频| 老司机午夜精品| 欧美日韩国产精品一区| 国产亚洲精品久| 国产一级一区二区| 国产精品亚洲一区| 亚洲精品久久久蜜桃| 欧美一级视频免费在线观看| 午夜精品久久久久久99热软件| 亚洲欧洲视频在线| 久久久噜噜噜久久中文字幕色伊伊| 欧美久久一区| 一本色道久久综合精品竹菊| 久久最新视频| 裸体素人女欧美日韩| 亚洲视频在线观看一区| 欧美黑人多人双交| 久久久噜噜噜| 欧美一区二区成人6969| 一区二区三区黄色| 亚洲精品乱码久久久久久按摩观| 国产亚洲va综合人人澡精品| 欧美人与性动交cc0o| 久久久久久久久久久一区 | 亚洲精品乱码久久久久久黑人| 亚洲国产综合91精品麻豆| 亚洲欧洲精品一区二区三区| 久久精品国产91精品亚洲| 久久综合九色综合久99| 欧美日韩视频在线| 夜色激情一区二区| 久久高清福利视频| 欧美成人精品三级在线观看| 亚洲第一级黄色片| 久热国产精品| 国内精品一区二区三区| 欧美77777| 99精品久久| 欧美在线视频观看| 国产一区二区0| 看片网站欧美日韩| 欧美一区二区在线| 免费在线视频一区| 精品福利电影| 国产精品久久久久久久久果冻传媒| 亚洲美女网站| 好看的日韩视频| 亚洲精品久久| 亚洲欧美日韩一区二区|