[kuangbin带你飞]专题四 最短路练习 P HDU 4725

来源:互联网 发布:网络写手收入排行 编辑:程序博客网 时间:2024/06/07 00:58

题目地址:https://vjudge.net/contest/66569#problem/P

思路:这个复杂度,按照常规方法建图显然是不行的,然而并没有想出如何建图比较好。看了kuangbin大神的题解,恍然大悟。他将每一层抽象为两个点,然后利用这个出点和入点进行建图。巧妙啊~~~大神果然是不一般。我等菜鸟只能不知所措……

kuangbin大神的题解:http://www.cnblogs.com/kuangbin/archive/2013/09/11/3315071.html

AC代码:

#include<bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;const int maxn=1e5*3+10;vector<pair<int,int> >E[maxn];int d[maxn];int n,m,c;void init(){    for(int i=0;i<maxn;i++)    {         E[i].clear();         d[i]=INF;    }}int main(){    int t;    scanf("%d",&t);    int casei=1;    while(t--)    {        init();        scanf("%d%d%d",&n,&m,&c);        for(int i=1;i<=n;i++)        {            int temp;            scanf("%d",&temp);            E[i].push_back(make_pair(n+2*temp-1,0));            E[n+2*temp].push_back(make_pair(i,0));        }        for(int i=1;i<n;i++)        {            E[n+2*i-1].push_back(make_pair(n+2*i+2,c));            E[n+2*i+1].push_back(make_pair(n+2*i,c));        }        for(int i=1;i<=m;i++)        {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            E[a].push_back(make_pair(b,c));            E[b].push_back(make_pair(a,c));        }        priority_queue<pair<int,int> >q;        d[1]=0;        q.push(make_pair(-d[1],1));        while(!q.empty())        {            int now=q.top().second;            q.pop();            for(int i=0;i<E[now].size();i++)            {                int v=E[now][i].first;                if(d[v]>d[now]+E[now][i].second)                {                    d[v]=d[now]+E[now][i].second;                    q.push(make_pair(-d[v],v));                }            }        }        if(d[n]==INF)            d[n]=-1;        printf("Case #%d: %d\n",casei++,d[n]);    }}


0 0
原创粉丝点击