UVA 11367満タン油解題報告
2003 ワード
【問題の説明】
n都市間のm本の道路を与える.始点Aと終点B、および自動車のメールボックス容量cを与え、AからBまでの最も安い経路を計算する.初期のメールボックスが空であると仮定します.i番目の都市の原油価格はpiです.Qグループの問い合わせに答える必要があります.
【入力形式】
第1の挙動n,mは、都市数と道路数を表し、そのうち都市番号は1である.n.次のn行は、各行に1つの整数pi、i+1行目のpiは、i番目の都市の原油価格がpiであることを示す.さらに次のm+1行は、行ごとに1つの道路a,b,d(0<=a,b
【出力形式】
質問ごとに1つの整数を出力、質問に対応する最も安いパスを表し、到着できない場合はimpossibleを出力する.
【入力サンプル】
5 5
10
10
20
12
13
1 2 9
1 3 8
2 3 1
2 4 11
3 4 7
2
10 2 4
20 3 5
【出力サンプル】
80
impossible
【データ範囲】
n<=200 m<=10000 q<=100 0
【出所】
『大白書』UVa 11367
UVa問題ライブラリのこの問題の都市は0からn-1番の都市であり、n<=1000であることに注意してください.
解題の構想はコードとコードの中の解釈を見て、以下のコードはUVaの原題を通過するコードです.
n都市間のm本の道路を与える.始点Aと終点B、および自動車のメールボックス容量cを与え、AからBまでの最も安い経路を計算する.初期のメールボックスが空であると仮定します.i番目の都市の原油価格はpiです.Qグループの問い合わせに答える必要があります.
【入力形式】
第1の挙動n,mは、都市数と道路数を表し、そのうち都市番号は1である.n.次のn行は、各行に1つの整数pi、i+1行目のpiは、i番目の都市の原油価格がpiであることを示す.さらに次のm+1行は、行ごとに1つの道路a,b,d(0<=a,b
【出力形式】
質問ごとに1つの整数を出力、質問に対応する最も安いパスを表し、到着できない場合はimpossibleを出力する.
【入力サンプル】
5 5
10
10
20
12
13
1 2 9
1 3 8
2 3 1
2 4 11
3 4 7
2
10 2 4
20 3 5
【出力サンプル】
80
impossible
【データ範囲】
n<=200 m<=10000 q<=100 0
【出所】
『大白書』UVa 11367
UVa問題ライブラリのこの問題の都市は0からn-1番の都市であり、n<=1000であることに注意してください.
解題の構想はコードとコードの中の解釈を見て、以下のコードはUVaの原題を通過するコードです.
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1005;
const int inf=1000000010;
int N,M,a,b,q,c;
int p[maxn];
vectorg[maxn],w[maxn];
struct data
{
int id,v,s;
friend bool operator < (data aa,data bb)
{
return aa.v>bb.v;
}
};
int d[maxn][105]; //f(i,j) i j
void DIJ(int s)
{
priority_queueq;
for(int i=0;i<=N;i++)
for(int j=0;j<=c;j++)
d[i][j]=inf;
q.push((data){s,0,0});
d[s][0]=0;
while(!q.empty())
{
data t=q.top(); q.pop();
int i=t.id;
if(i==b) // , , ,
{
printf("%d
",t.v);
return;
}
if(d[i][t.s]t.v+p[i]) // , ,
{
d[i][t.s+1]=t.v+p[i];
q.push((data){i,d[i][t.s+1],t.s+1});
}
for(int k=0;k