一、昂贵的聘礼
学习最短路径算法dijkstra后的第一次刷题实践,发现题目是加了限制的最短路径求解,只得在网上看了一些思路和程序,借鉴着艰难的写出来。测试了许多数据,都是正确的,提交却显示错误,mark一下,需进一步检查,代码如下:
#include<iostream>
using namespace std;
const int inf=0x7fffffff;
int M,N;
int price[101][101];
int lv[101];
int x[101];
int dist[101];
bool vist[101];
int dijkstra()
{
int i,j;
int min,nu_temp;
for(i=1;i<=N;i++)
{
min=inf;
nu_temp=0;
for(j=1;j<=N;j++)
{
if(!vist[j]&&dist[j]<min)
{
min=dist[j];
nu_temp=j;
}
}
if(nu_temp==0)
break;
vist[nu_temp]=true;
for(j=1;j<=N;j++)
{
if(!vist[j]&&price[nu_temp][j]>0&&dist[j]>dist[nu_temp]+price[nu_temp][j])
{
dist[j]=dist[nu_temp]+price[nu_temp][j];
}
}
}
return dist[1];
}
int main()
{
memset(price,0,sizeof(price));
memset(lv,0,sizeof(lv));
// memset(x,0,sizeof(x));
memset(dist,inf,sizeof(dist));
memset(vist,false,sizeof(vist));
int min_price=inf;
cin>>M>>N;
int i,j;
for(i=1;i<=N;i++)
{
cin>>price[0][i]>>lv[i]>>x[i];
dist[i]=price[0][i];
for(j=1;j<=x[i];j++)
{
int nu,np;
cin>>nu>>np;
price[nu][i]=np;
}
}
for(i=1;i<=N;i++)
{
int maxlevel=lv[i];
int temp_price;
for(j=1;j<=N;j++)
{
if(lv[j]>maxlevel||maxlevel-lv[j]>M)
vist[j]=true;
else
vist[j]=false;
}
temp_price=dijkstra();
if(min_price>temp_price)
{
min_price=temp_price;
}
}
cout<<min_price<<endl;
return 0;
}