hdu 2066 一个人的旅行
2011-03-17 18:37
381 查看
dijkstra
水过
水过
#include<iostream> #include<queue> using namespace std; #define inf 100000000 #define N 1005 struct node { int v,time; }; struct edge { int v,d; edge *next; }; struct cmp{ bool operator()(node a,node b){ return a.time>b.time; } }; priority_queue<node,vector<node>,cmp>que; bool use ,city ; int dp ; edge *gragh ; void add_edge(int u,int v,int d) { edge *ptr=new edge; ptr->d=d; ptr->v=v; ptr->next=gragh[u]; gragh[u]=ptr; return ; } void init(int t,int s,int d) { int i,a,b,time; node temp; for(i=1;i<=N;i++) gragh[i]=NULL; for(i=0;i<t;i++) { scanf("%d%d%d",&a,&b,&time); add_edge(a,b,time); add_edge(b,a,time); } for(i=1;i<=N;i++) dp[i]=inf; while(!que.empty()) que.pop(); for(i=0;i<s;i++) { scanf("%d",&a); temp.v=a,temp.time=0; dp[a]=0; que.push(temp); } memset(city,0,sizeof(city)); for(i=0;i<d;i++) { scanf("%d",&a); city[a]=1; } } int dijkstra() { memset(use,0,sizeof(use)); int v,time; node temp; while(!que.empty()) { temp=que.top(); que.pop(); v=temp.v,time=temp.time; if(use[v]) continue; if(city[v]) return time; use[v]=1; for(edge *ptr=gragh[v];ptr;ptr=ptr->next) if(dp[ptr->v]>dp[v]+ptr->d&&!use[ptr->v]) { dp[ptr->v]=dp[v]+ptr->d; temp.time=dp[ptr->v]; temp.v=ptr->v; que.push(temp); } } return 0; } int main() { int s,t,d; while(scanf("%d%d%d",&s,&t,&d)!=EOF) { init(s,t,d); printf("%d/n",dijkstra()); } return 0; }
相关文章推荐
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行(最短路)
- HDU 2066 一个人的旅行
- HDU - 2066 一个人的旅行 —— dijkstra
- HDU 2066 一个人的旅行 (单源最短路)
- HDU2066 一个人的旅行(dijkstra算法)
- HDU 2066 一个人的旅行 超级源点
- HDU 2066-一个人的旅行(最短路Dijkstra)
- hdu 2066 一个人的旅行
- HDU 2066 一个人的旅行dijikstra算法
- HDU 2066一个人的旅行(dijk最短路)
- hdu 2066 一个人的旅行(Dijkstra求最短路问题)
- hdu 2066 一个人的旅行 最短路径
- ACM->dijkstra + heap + stl 一个人的旅行 hdu 2066
- HDU 2066 【Dijkstra】 一个人的旅行
- HDU 2066 一个人的旅行(dijkstra)
- HDU 2066 一个人的旅行 (floyd算法)