poj-4046-Sightseeing-最短路

來源:互聯網
上載者:User

標籤:blog   os   2014   for   io   amp   

首先算出mp[i][j]:

以i為最高點,i到j的最短距離是多少。

然後對於每次詢問,枚舉最高點。

結果就為min(mp[i][st]+mp[i][ed]+val[i]);

但是這個題我用SFL最佳化了一下。。

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<map>#include<math.h>#include<deque>using namespace std;#define maxn 1010#define maxm 20020#define LL long long#define INF (LL)99999999999999struct listt{    int u,v;    LL w;    int next;}edge[maxm*2];int head[maxn];int nums;void init(){    memset(head,-1,sizeof(head));    nums=1;}void add(int u,int v,LL w){   // cout<<"add"<<u<<" "<<v<<" "<<w<<endl;    edge[nums].u=u;    edge[nums].v=v;    edge[nums].w=w;    edge[nums].next=head[u];    head[u]=nums++;}LL mp[maxn][maxn];LL val[maxn];deque<int>que;LL dist[maxn];int vis[maxn];int n;void spfa(int st){    for(int i=1;i<=n;i++)dist[i]=INF;    memset(vis,0,sizeof(vis));    dist[st]=0;    que.push_back(st);    vis[st]=1;    while(!que.empty())    {        int x=que.front();        que.pop_front();        vis[x]=0;       // cout<<x<<"-"<<endl;;        for(int i=head[x];i!=-1;i=edge[i].next)        {            int y=edge[i].v;          //  cout<<i<<" "<<y<<" "<<val[y]<<" "<<val[x]<<endl;            if(val[y]>val[st])continue;            if(dist[y]>dist[x]+edge[i].w)            {                dist[y]=dist[x]+edge[i].w;                if(!vis[y])                {                    if(!que.empty())                    {                        if(dist[y]>dist[que.front()])que.push_back(y);                        else que.push_front(y);                    }                    else que.push_back(y);                    vis[y]=1;                }            }        }    }   // printf("_________________%d\n",st);    for(int i=1;i<=n;i++)    {        mp[st][i]=dist[i];   //     printf("%lld ",mp[st][i]);    } //   cout<<endl;}struct lisq{    int st;    int ed;    LL minn;}Q[maxm];int main(){    int m,q;    while(~scanf("%d%d",&n,&m)&&(n||m))    {        init();        while(!que.empty())que.pop_back();        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                mp[i][j]=INF;            }            mp[i][i]=0;        }        for(int i=1;i<=n;i++)            scanf("%lld",&val[i]);        int u,v;        LL w;        for(int i=1;i<=m;i++)        {            scanf("%d%d%lld",&u,&v,&w);            add(u,v,w);            add(v,u,w);        }        scanf("%d",&q);        int st,ed;        for(int i=1;i<=q;i++)        {            scanf("%d%d",&Q[i].st,&Q[i].ed);            Q[i].minn=INF;        }        for(int i=1;i<=n;i++)        {            spfa(i);            for(int j=1;j<=q;j++)            {                Q[j].minn=min(Q[j].minn,mp[i][Q[j].st]+mp[i][Q[j].ed]+val[i]);            }        }        for(int i=1;i<=q;i++)        {            if(Q[i].minn<INF)printf("%lld\n",Q[i].minn);            else puts("-1");        }        cout<<endl;    }    return 0;}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.