HDU 2066 一个人的旅行 超级源点
2013-02-15 22:13
344 查看
转载请注明该文链接
题意:给一些城市,一些无向边,可以以给定的好几个城市中的任何一个为源点,然后给定了几个城市作为任选其一的终点,求从源点到汇点的最短时间。
思路:把所有可设为源点的城市记为超级源点,即任意两个城市之间的距离均为0,然后以任一个起点为源点跑一遍SPFA。枚举所有终点,选最小那个就可以了。
修正:经过不断学习,发现我这样做耗费空间比较多(数据较弱所以过了,开E[M<<1]这么大其实是不够的),正确做法见我做的这道题,题意是一样的,只是变成单汇点而已。
下面的代码已修正写法。
代码:
题意:给一些城市,一些无向边,可以以给定的好几个城市中的任何一个为源点,然后给定了几个城市作为任选其一的终点,求从源点到汇点的最短时间。
思路:把所有可设为源点的城市记为超级源点,即任意两个城市之间的距离均为0,然后以任一个起点为源点跑一遍SPFA。枚举所有终点,选最小那个就可以了。
修正:经过不断学习,发现我这样做耗费空间比较多(数据较弱所以过了,开E[M<<1]这么大其实是不够的),正确做法见我做的这道题,题意是一样的,只是变成单汇点而已。
下面的代码已修正写法。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<string> #include<map> #include<queue> #include<algorithm> #include<cmath> using namespace std; typedef __int64 ll; const int N=1100; const int M=10010; const ll inf=1LL<<60; struct node { int v; ll dis; node *next; }E[M<<1],*G ,*head; inline void add(int a,int b,int c,node *G[]) { head->v=b; head->dis=c; head->next=G[a]; G[a]=head++; } int T,S,D; ll d ; bool inq ; int s ; int go ; void init() { memset(inq,false,sizeof(inq)); memset(G,0,sizeof(G)); head=E; fill(d,d+N,inf); } void SPFA(int s,ll d[],node *G[]) { deque<int> Q; Q.push_front(s); d[s]=0; while(!Q.empty()) { int u=Q.front(); Q.pop_front(); inq[u]=false; for(node *p=G[u];p;p=p->next) { int v=p->v; ll dis=p->dis; if(d[v]>d[u]+dis) { d[v]=d[u]+dis; if(!inq[v]) { inq[v]=true; if(!Q.empty() && d[v]<=d[Q.front()]) Q.push_front(v); else Q.push_back(v); } } } } } int main() { while(~scanf("%d%d%d",&T,&S,&D)) { init(); int a,b; ll c; for(int i=0;i<T;i++) { scanf("%d%d%I64d",&a,&b,&c); add(a,b,c,G); add(b,a,c,G); } for(int i=0;i<S;i++) { scanf("%d",&s[i]); } for(int i=0;i<S;i++)//以0为超级源点 { add(s[i],0,0,G); add(0,s[i],0,G); } SPFA(0,d,G); ll ans=inf; for(int i=0;i<D;i++) { scanf("%d",&go[i]); ans=min(ans,d[go[i]]); } printf("%I64d\n",ans); } return 0; }
相关文章推荐
- hdu 2066 一个人的旅行(超级纠结)终于AC (用邻接表写了一个)
- Hdu 2066 一个人的旅行(dijkstra算法,超级起点)
- HDU 2066 一个人的旅行 超级起点 多源起点dijkstra
- HDU 2066 一个人的旅行(dijkstra)
- HDU 2066 一个人的旅行
- HDU-2066 一个人的旅行(图论,Floyd ,最短路)
- hdu 2066 一个人的旅行
- HDU - 2066 - 一个人的旅行
- 【最短路径-Floyd】hdu 2066 一个人的旅行
- hdu 2066一个人的旅行 Dijkstra算法应用
- HDU 2066 一个人的旅行
- HDU 2066:一个人的旅行【Dijkstra & SPFA & Floyd】
- hdu 2066 一个人的旅行【Dijkstra】解法
- HDU 2066 一个人的旅行
- hdu 2066 一个人的旅行-spfa
- hdu 2066 一个人的旅行
- hdu 2066 一个人的旅行 最短路 dijkstra 解题报告
- HDU 2066 一个人的旅行(spfa)
- HDU 2066 一个人的旅行 【Dijkstra】
- hdu 2066 一个人的旅行