hdu2680
2015-12-31 08:47
190 查看
http://acm.hdu.edu.cn/showproblem.php?pid=2680
题意就是给你n个起点,一个重点,问从起点到终点最小的花费是多少= =
首先这题是有向图,然后我们把起点看成是终点,终点看成起点。然后用迪杰斯特拉算法求最短路。然后因为我们把终点和起点换了,所以我们建图的时候本来是x->y,要写成y->x
题意就是给你n个起点,一个重点,问从起点到终点最小的花费是多少= =
首先这题是有向图,然后我们把起点看成是终点,终点看成起点。然后用迪杰斯特拉算法求最短路。然后因为我们把终点和起点换了,所以我们建图的时候本来是x->y,要写成y->x
#include<stdio.h> #include<string.h> #include<queue> #include<vector> #include<iostream> #include<algorithm> using namespace std; const int maxn=2*50000; #define inf 99999999 struct node { int v; int w; int next; }V[maxn]; int head[maxn]; int d[maxn]; int n; int tol; int done[maxn]; typedef pair<int,int>pii; priority_queue<pii,vector<pii>,greater<pii> >q; void init() { tol=0; memset(head,-1,sizeof(head)); } void dijk(int s) { while(!q.empty()) q.pop(); memset(done,0,sizeof(done)); for(int i=1;i<=n;i++) d[i]=inf; d[s]=0; q.push(make_pair(d[s],s)); while(!q.empty()) { pii u=q.top(); q.pop(); int x=u.second; if(done[x]) continue; done[x]=1; for(int e=head[x];e!=-1;e=V[e].next) { int v=V[e].v; int w=V[e].w; if(d[x]+w<d[v]) { d[v]=d[x]+w; q.push(make_pair(d[v],v)); } } } } void add(int u,int v,int w) { V[tol].v=v; V[tol].w=w; V[tol].next=head[u]; head[u]=tol++; } int main() { int m,s; while(scanf("%d %d %d",&n,&m,&s)!=EOF) { init(); int x,y,z; while(m--) { scanf("%d %d %d",&x,&y,&z); add(y,x,z); } dijk(s); int num,ans=inf; bool flag=0; scanf("%d",&num); int id; while(num--) { scanf("%d",&id); if(d[id]<ans) { flag=1; ans=d[id]; } } if(flag) printf("%d\n",ans); else printf("-1\n"); } return 0; }
相关文章推荐
- Android自定义开关按钮
- LVM逻辑卷管理-卷的缩减和扩容
- jQuery实现简单的图片查看器
- Android TabLayout重设Tab点击事件
- php-支付宝接口
- Qt 获取usb设备信息 hacking
- VC6/WTL/Platform SDK等
- 解决几个服务的小问题
- 【剑指offer】出现次数超过一半的数字
- 串口通信的相关概念和理解原理
- HUD(2444)
- Uva(10158)
- Uva(10594)
- Uva11045
- Uva753
- Uva(10330)
- Uva 558 Wormholes
- Uva(10986)
- hdu2066(迪杰斯特拉算法模板)
- 10099 The Tourist Guide