1. 程式人生 > >A類 洛谷P1359 租用遊艇

A類 洛谷P1359 租用遊艇

A類 洛谷P1359 租用遊艇

題意:

程式設計計算從遊艇出租站1 到遊艇出租站n所需的最少租金。

分析:

輸入從u,v,w變成了半三角輸入

依然用了Dijkstra優先佇列+堆。

程式碼:

//洛谷P1359 租用遊艇
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

#define maxn 100010
#define maxm 500010
#define INF 0x7fffffff

int head[maxn],cnt=-1
,n,m,s,vis[maxn],dis[maxn]; int q1; struct Edge{ int u,v,w; }; struct node{ //堆節點 int w,pos; bool operator<(const node &x)const{ return w>x.w; } }; priority_queue<node>q; // vector<int>g[202]; vector<Edge> edge; void dijkstra(){ memset(dis,
127/3,sizeof(dis)); dis[1]=0; // 賦初值 s到s的距離為0 q.push((node){0,1}); // 把源點扔進堆裡 while(!q.empty()){ node x=q.top(); // 取堆頂 q.pop(); // 彈堆 int u=x.pos; q1=g[u].size(); if(vis[u]) continue; vis[u]=1; for(int i=0;i<q1;i++){ Edge
&e=edge[g[u][i]]; if(dis[e.v]>dis[u]+e.w){ dis[e.v]=dis[u]+e.w; q.push((node){dis[e.v],e.v}); } } } } int main(){ scanf("%d",&n); for(int i=1;i<n;i++){ for(int j=i+1;j<=n;j++){ scanf("%d",&q1); edge.push_back((Edge){i,j,q1}); g[i].push_back(++cnt); } } dijkstra(); printf("%d",dis[n]); return 0; }