洛谷 P1359 租用游艇(spfa) 题解

题目来源:

https://www.luogu.org/problemnew/show/P1359

题目描述:

 

题目描述

长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1<=i<=j<=n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n 所需的最少租金。

对于给定的游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1<=i

保证计算过程中任何时刻数值都不超过10^6

输入输出格式

输入格式:

 

由文件提供输入数据。文件的第1 行中有1 个正整数n(n<=200),表示有n个游艇出租站。接下来的n-1 行是一个半矩阵r(i,j),1<=i

 

输出格式:

 

程序运行结束时,将计算出的从游艇出租站1 到游艇出租站n所需的最少租金输出到文件中。

 

输入输出样例

输入样例#1: 复制

3
5 15
7

输出样例#1: 复制

12

解题思路:

       裸的最短路,搞清楚读入就行。。

#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=205;
struct newt
{
    int to,next,val;
}e[maxn*maxn];
int n,cnt,m,vis[maxn],head[maxn],dis[maxn];
void addedge(int u,int v,int w)
{
    e[cnt].to=v;
    e[cnt].val=w;
    e[cnt].next=head[u];
    head[u]=cnt++;
}
int main()
{
    memset(dis,inf,sizeof(dis));
    memset(head,-1,sizeof(head));
    cnt=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    for(int j=i+1;j<=n;j++)
    {
        int w;
        scanf("%d",&w);
        addedge(i,j,w);
    }
    queueq;
    vis[1]=1;
    q.push(1);
    dis[1]=0;
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        vis[now]=0;
        for(int i=head[now];i!=-1;i=e[i].next)
        {
            int v=e[i].to;
            if(dis[v]>dis[now]+e[i].val)
            {
                dis[v]=dis[now]+e[i].val;
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    printf("%d\n",dis[n]);
    return 0;
}

 

你可能感兴趣的:(洛谷,图论)