最短路-邻接表(优先队列)写
来源:互联网 发布:python 验证码识别 编辑:程序博客网 时间:2024/05/24 02:37
题目链接:http://codevs.cn/problem/2038/
题目描述 Description
农夫John发现做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道N(1<=N<=500)只奶牛会过来舔它,这样就能做出能卖好价钱的超甜黄油。当然,他将付出额外的费用在奶牛上。
农夫John很狡猾。他知道他可以训练这些奶牛,让它们在听到铃声时去一个特定的牧场。他打算将糖放在那里然后下午发出铃声,以至他可以在晚上挤奶。
农夫John知道每只奶牛都在各自喜欢的牧场呆着(一个牧场不一定只有一头牛)。给出各头牛在的牧场和牧场间的路线,找出使所有牛到达的路程和最短的牧场(他将把糖放在那)。
输入描述 Input Description
第一行: 三个数:奶牛数N,牧场数P(2<=P<=800),牧场间道路数C(1<=C<=1450).
第二行到第N+1行: 1到N头奶牛所在的牧场号.
第N+2行到第N+C+1行: 每行有三个数:相连的牧场A、B,两牧场间距(1<=D<=255),当然,连接是双向的.
输出描述 Output Description
一行 输出奶牛必须行走的最小的距离和.
样例输入 Sample Input
3 4 52341 2 11 3 52 3 72 4 3
3 4 5
样例图形
P2 P1 @--1--@ C1 \ |\ \ | \ 5 7 3 \ | \ \| \ C3 C2 @--5--@ P3 P4
样例输出 Sample Output
8
{说明: 放在4号牧场最优. }
说明:通过集合存边,找最近的边,意思是刚刚入队的边,有点像bfs。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<string>#include<vector>#include<queue>#include<set>#include<map>#include<cmath>#define mst(ss,b) memset((ss),(b),sizeof(ss))#define maxn 0x3f3f3f3fusing namespace std;int n,p,c,tot=0;struct node { int v,w,next;} edge[1500*10];struct Node { int id,v; bool operator <(const Node&a)const { return v>a.v; }};int dis[801],vis[801],num[550],head[1500*4];void Insert(int u,int v,int w) { edge[tot].v=v; edge[tot].w=w; edge[tot].next=head[u]; head[u]=tot++;}void spfa(int temp) { mst(vis,0); priority_queue<Node> qu; while(!qu.empty()) qu.pop(); for(int i=1; i<=p; i++) dis[i]=maxn; dis[temp]=0; Node kk; kk.id=temp; kk.v=dis[temp]; qu.push(kk); while(!qu.empty()) { Node now=qu.top(); qu.pop(); if(vis[now.id]==1) continue; vis[now.id]=1; for(int i=head[now.id]; i!=-1; i=edge[i].next) { int v=edge[i].v; int w=edge[i].w; if(!vis[v] && dis[now.id]+w<dis[v]) { dis[v]=dis[now.id]+w; Node aa; aa.id=v; aa.v=dis[v]; qu.push(aa); } } }}int main() { cin.sync_with_stdio(false); cin>>n>>p>>c; mst(head,-1); for(int i=1; i<=n; i++) cin>>num[i]; for(int i=1; i<=c; i++) { int a,b,len; cin>>a>>b>>len; Insert(a,b,len); Insert(b,a,len); } int ans=maxn; for(int i=1; i<=p; i++) { spfa(i); int sum=0; for(int i=1; i<=n; i++) sum+=dis[num[i]]; ans=min(sum,ans); } cout<<ans<<endl; return 0;}
0 0
- 最短路-邻接表(优先队列)写
- HDU 2544 最短路 静态邻接表+优先队列 dijkstra
- POJ 1724 ROADS 最短路 邻接表 + bfs +优先队列
- hdu 2544 最短路(Dijkstra 邻接表+优先队列)
- POJ1724---ROADS (最短路变形(邻接表+优先队列))
- ACM:最短路,dijkstra,邻接表的建立,使用邻接表跟优先队列的dijkstra,Bellman-Ford,Floyd。。
- dijsttra 邻接表+优先队列
- Dijkstra(邻接表+优先队列)
- uva 11374 最短路+记录路径 好题 dijkstra优先队列优化算法 邻接表法 可做模板 G++提交
- 邻接表实现最短路
- 优先队列Dijkstra实现最短路算法
- poj 3662 最短路+优先队列+二分法
- 最短路(Dijkstra+优先队列)
- poj3635-DP+优先队列搜索最短路
- 最短路算法(Dijsktra + 优先队列)
- ZOJ 2526(最短路+优先队列)
- 优先队列解决最短路问题
- POJ 2312<优先队列><最短路>
- 简说拉格朗日对偶
- 2/1+3/2+5/3+8/5+13/8+...求出该数列前20项的和
- Android中全屏或者取消标题栏
- Java SE 第八讲(理解面向对象程序设计)
- p1122 最优贸易 点权的spfa
- 最短路-邻接表(优先队列)写
- Android中Toast显示消息用法
- Lq_字母图形
- HDU 2027 统计元音
- Java SE 第九讲(面向对象之封装)
- VC++/MFC
- 基于vb.net的数据库访问——ADO.NET(一)
- 动态规划练习题:【Hdu 4283】 You Are the One (DP_区间DP)
- Extjs4学习中的错误处理