題意:k點點數,n個點,m條邊,每條邊有權值以及通過時會消耗的點數,求在消耗點數不超過k點的情況下,從1到n的最短路徑。
分析:顯然是乙個最短路的變形,而且是一種常見的模型。最短路本身是乙個求解最優解的問題,在這裡加多了乙個限制條件,就是點數,所以變為「在一定的限制條件下求解乙個最優化問題」的模型,這樣的模型,有乙個大致的套路:在滿足限制條件後,再進行更新。
求解方法有很多,我用的是優先佇列+dij的方法,開始時把源點放入優先佇列裡,然後每次取出路徑最小的頂點,在消耗點數允許的條件下更新它的鄰接點,並放入優先佇列中,直到取出終點為此。此時,終點的路徑就是所求最短路徑。
**如下:
#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef long long ll;
typedef pairpii;
const int n=10100;
const int inf=1e9;
int n,m,k,ans,d[n],cost[n];
int u[n],v[n],w[n],t[n],first[n],next[n];
bool vis[n];
typedef struct node
}node;
struct cmp
};void build() // 建立鄰接表
//if (d[r.second]!=r.first) continue;
for (i=first[r.v];i!=-1;i=next[i]) if (r.c+t[i] <=k)
}delete h;
return false;
}int main()
else printf("-1\n");
}}
poj 1724 ROADS bfs 優先佇列
題目鏈結 題意 在有費用k限制的條件下,求從1到n的最短距離,如果最短距離相同求費用最小的,邊為有向邊,其中可能有 多個相同的源點和目標點,但是距離和費用不同。分析 用bfs和鄰接表來把每乙個邊搜一下,因為用了優先佇列,所以先到n的一定是最小的 1 include 2 include 3 inclu...
poj1724 帶限制的最短路
題意 乙個人要從1點到n點,有m條邊可以走,走每條邊要花一些錢,這個人只有k的錢,問花的錢不多於k且能到n的最短路。spfa解決最短路,不過dist陣列要加一維,dist i j 表示從1走到了i花了j錢的最短路。感覺這時候就是個bfs include include include include...
poj3013 鄰接表 優先佇列 Dij
把我坑到死的題 開始開題以為是全圖連通是的最小值 以為是最小生成樹,然後敲了發現不是,看了下別人的題意,然後懂了 然後發現資料大,要用鄰接表就去學了一下鄰接表,然後又去學了下優先佇列優化的dij 這坑爹的題目我交了10幾遍,也不知道錯在 後來知道了maxint要 define maxint 1000...