A類 洛谷P1359 租用遊艇
阿新 • • 發佈:2018-11-21
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; }