题意:给n个点即n个点的高度,问一条最短路的最大高度差最小值是多少?
想法:枚举所有两个点之间的高度差,然后把这个限制用最短路去跑,可以完成的最小的限制即是答案,还有,不要写无用的函数在上面,会wa,我丫的多谢了一个绝对值函数,wa到死啊。
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> #define inf 0x7f7f7f7f using namespace std; const int nodes=100+50; const int edges=100000+50; int n,m; struct node { int v,next; int w; }e[edges]; struct nodee { int low,up,dif; }H[edges]; int head[nodes],cnt; int h[nodes]; void Init() { memset(head,-1,sizeof(head)); cnt=0; } void add(int a,int b,int c) { e[cnt].v=b; e[cnt].w=c; e[cnt].next=head[a]; head[a]=cnt++; } bool cmp(nodee a,nodee b) { return a.dif<b.dif; } int spfa(int id) { queue<int>q; while(!q.empty()) q.pop(); int dis[nodes]; int vis[nodes]; for(int i=1;i<=n;i++) { dis[i]=inf; vis[i]=0; } vis[1]=1; dis[1]=0; q.push(1); while(!q.empty()) { int u=q.front(); q.pop(); if(h[u]<H[id].low||h[u]>H[id].up) continue; vis[u]=0; for(int i=head[u];i+1;i=e[i].next) { int v=e[i].v; if(H[id].low<=h[v]&&h[v]<=H[id].up&&dis[v]>dis[u]+e[i].w) { dis[v]=dis[u]+e[i].w; if(!vis[v]) { vis[v]=1; q.push(v); } } } } return dis[n]; } int Max(int a,int b) { if(a>b) return a; return b; } int Min(int a,int b) { if(a<b) return a; return b; } int main() { int test; scanf("%d",&test); while(test--) { Init(); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&h[i]); } for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } int num=0; for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { H[num].low=Min(h[i],h[j]); H[num].up=Max(h[i],h[j]); H[num].dif=H[num].up-H[num].low; num++; } } sort(H,H+num,cmp); int pos; int dd; for(int i=0;i<num;i++) { dd=spfa(i); if(dd!=inf) { pos=i; break; } } printf("%d %d\n",H[pos].dif,dd); } return 0; }