hdu 2363(最短路+枚举)
2013-04-14 20:30
295 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2363
思路:和之前hdu上做过的一题很像。。。就是先求求出所有的高度差,排序后枚举,每次都一次spfa,求出dist,若dist
!=inf,说明是在最小高度差下找到了最短路径,直接break即可。。。另外,发现若不用visited[]标记的话,时间是其两倍。。。orz....以后还是老老实实加visited [] 吧。。。
View Code
思路:和之前hdu上做过的一题很像。。。就是先求求出所有的高度差,排序后枚举,每次都一次spfa,求出dist,若dist
!=inf,说明是在最小高度差下找到了最短路径,直接break即可。。。另外,发现若不用visited[]标记的话,时间是其两倍。。。orz....以后还是老老实实加visited [] 吧。。。
View Code
#include<iostream> #include<queue> #include<vector> #include<algorithm> const int MAXN=110; const int inf=1<<30; using namespace std; struct Node{ int v,w; }; vector<Node>mp[MAXN]; struct Point{ int low,high; }H[MAXN*MAXN]; int h[MAXN]; int dist[MAXN]; bool visited[MAXN]; int n,m; int cmp(const Point &p,const Point &q){ return (p.high-p.low)<(q.high-q.low); } void SPFA(int low,int high){ for(int i=1;i<=n;i++)dist[i]=inf; dist[1]=0; memset(visited,false,sizeof(visited)); queue<int>Q; Q.push(1); while(!Q.empty()){ int u=Q.front(); Q.pop(); visited[u]=false;//出队列要要置为false,因为有可能再次进队列 if(h[u]<low||h[u]>high)continue;//起点要限制 for(int i=0;i<mp[u].size();i++){ int v=mp[u][i].v; int w=mp[u][i].w; //高度限制 if(h[v]>=low&&h[v]<=high &&dist[u]+w<dist[v]){ dist[v]=dist[u]+w; if(!visited[v]){ Q.push(v); visited[v]=true; } } } } } int main(){ int _case; scanf("%d",&_case); while(_case--){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)mp[i].clear(); memset(H,0,sizeof(H)); memset(h,0,sizeof(h)); for(int i=1;i<=n;i++){ scanf("%d",&h[i]); } for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); Node p1,p2; p1.v=u,p2.v=v; p1.w=p2.w=w; mp[u].push_back(p2); mp[v].push_back(p1); } int k=0; for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ H[k].low=min(h[i],h[j]); H[k++].high=max(h[i],h[j]); } } sort(H,H+k,cmp); int i=0; while(i<k){ SPFA(H[i].low,H[i].high); if(dist !=inf){ break; } i++; } printf("%d %d\n",H[i].high-H[i].low,dist ); } return 0; }
相关文章推荐
- HDU 2363 Cycling 最短路+枚举
- HDU 2363 Cycling 枚举限制+最短路
- hdu 2363(最短路+枚举)
- hdu 2363(限制最短路 二分+枚举+最短路)
- hdu 2363 Cycling (最短路spfa + 暴力枚举)
- HDU 2363 Cycling 【暴力枚举 + 最短路】
- hdu 2363(枚举+最短路好题)
- HDU 2363 Cycling(枚举+最短路)
- 【HDU】2363 Cycling 最短路
- 【HDU】1595 find the longest of the shortest 枚举+最短路
- Hdu 3986 【枚举】【最短路】 解题报告
- hdu 3986 Harry Potter and the Final Battle(最短路+枚举删边)
- hdu 1595 find the longest of the shortest【最短路+枚举】
- HDU 2363 Cycling(并查集 SPFA 暴力枚举)
- hdu 3986 (枚举+最短路)
- HDU 3768 Shopping 【最短路好题!!! + 离散化跑最短路 + 暴力枚举】
- HDU 2433 Travel 枚举+最短路
- 2015 沈阳站 hdu 5521 Meeting(Dij最短路枚举)
- hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】
- hdu 3986(最短路+枚举)