這道題目一開始我的思路就是錯了,前前後後掙扎了n個小時。。。開始的想法是dijkstra,通過二分列舉高度差。但是發現乙個問題,就是因為dijkstra裡面優先選擇的是短的路。我直接二分高度差,是有兩個限制條件。然後就想到spfa,後來仔細想了想還是不行。。。最後用dfs了,才100個點嘛,感覺穩了,結果又tle。。。。。。。
開了別人的題解一眼,恍然大悟。有兩個限制條件(用於選擇)的最短路怎麼能求呢?
所以本題的思路是,列舉任意的兩個點,兩個點的高度分別當作是low和up
另外注意判斷1==n的情況。。。真是無力吐槽了。。。
ac的**
//通過列舉最小邊還是不行
#include using namespace std;
#define res register int
#define ll long long
#define inf 0x3f3f3f3f
const int maxn=105;
int n,m,h[maxn];
int g[maxn][maxn];
int dis[maxn],vis[maxn];
int low,up;
int result;
struct nodenode[maxn*maxn];
bool operator<(const node a,const node b)
if(!vis[y])}}
} if(0==flag) return false;
else return true;
}int main()
} int a,b,v;
for(res i=1;i<=m;i++)
for(res i=1;i<=n;i++)
} return;
} int main()
} int a,b,c;
for(res i=1;i<=m;i++)else
} printf("%d %d\n",l,result);
} return 0;
}
hdu 2363 最短路 列舉)
思路 和之前hdu上做過的一題很像。就是先求求出所有的高度差,排序後列舉,每次都一次spfa,求出dist,若dist n inf,說明是在最小高度差下找到了最短路徑,直接break即可。另外,發現若不用visited標記的話,時間是其兩倍。orz.以後還是老老實實加visited 吧。1 incl...
hdu 2363 最短路 列舉)
思路 和之前hdu上做過的一題很像。就是先求求出所有的高度差,排序後列舉,每次都一次spfa,求出dist,若dist n inf,說明是在最小高度差下找到了最短路徑,直接break即可。另外,發現若不用visited標記的話,時間是其兩倍。orz.以後還是老老實實加visited 吧。1 incl...
hdu2362(列舉 最短路)
題意 給你n點,m條路,每個點都有不同的高度,題目要求在高度差最小的情況下的最短路徑。開始做這個題目時,我是用二次最短路在做的,回來發現思路錯了,就參考了大牛 恍然大悟。只要對高度公升序排序,然後列舉各個高度差下的最短路徑 include includeusing namespace std def...