Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u
Description
爲了方便起見,我們把所有的物品從1開始進行編號,酋長的允諾也看作一個物品,並且編號總是1。每個物品都有對應的價格P,主人的地位等級L,以及一系列的替代品Ti和該替代品所對應的"優惠"Vi。如果兩人地位等級差距超過了M,就不能"間接交易"。你必須根據這些數據來計算出探險家最少需要多少金幣才能娶到酋長的女兒。
Input
Output
Sample Input
1 4
10000 3 2
2 8000
3 5000
1000 2 1
4 200
3000 2 1
4 200
50 2 0
Sample Output
5250
#include"cstdio"
#include"cstring"
#include"iostream"
using namespace std;
#define INF 0x7f7f7f7f
int l_gap,g_num;
int dis[105];
int level[105];
int maze[105][105];
bool vis[105];
void init()
{
memset(vis,false,sizeof(vis));
memset(dis,INF,sizeof(dis));
}
void dijkstra(int low_level,int high_level)
{
init();
vis[0] = true; //0爲彙總點,初始化爲已訪問
for(int i = 0;i <= g_num;i++)
{
if(level[i] >= low_level && level[i] <= high_level) //在等級差距之內的替換物才能更新dis[i]
{
dis[i] = maze[0][i];
}
}
while(1)
{
int minn = INF;
int mark;
for(int i = 0;i <= g_num;i++)
{
if(level[i] >= low_level && level[i] <= high_level && !vis[i] && minn > dis[i])
{
minn = dis[i];
mark = i;
}
}
vis[mark] = true;
if(mark == 1) return;
for(int i = 0;i <= g_num;i++)
{
if(level[i] >= low_level && level[i] <= high_level && !vis[i] && dis[i] > dis[mark] + maze[mark][i])
{
dis[i] = dis[mark] + maze[mark][i];
}
}
}
}
int main()
{
while(~scanf("%d%d",&l_gap,&g_num))
{
int t_num; //替換物的數目
int id,discount;
memset(maze,INF,sizeof(maze));
for(int i = 1;i <= g_num;i++)
{
scanf("%d%d%d",&maze[0][i],&level[i],&t_num); //建立超級起點0,0到每一種物品的價格爲原價
for(int j = 0;j < t_num;j++)
{
scanf("%d%d",&id,&discount);
maze[id][i] = discount; //用替換物id“購買”物品i所需支付的費用discount
}
}
int ans = INF;
for(int i = level[1] - l_gap;i <= level[1];i++) //酋長以下l_gap級到酋長自身的等級,是可以交換的
{
dijkstra(i,i + l_gap);
if(dis[1] < ans)
{
ans = dis[1];
}
}
printf("%d\n",ans);
}
return 0;
}