您的位置:首页 > 其它

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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: