学习网址:http://blog.csdn.net/lyy289065406/article/details/6645852
keep moving..
枚举的做法:
<pre name="code" class="cpp">#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
const int inf=0x7fffffff;
int n,m,lv[101],price[101][101],dis[101],x[101];
bool vis[101];
void read_graph(){
cin>>m>>n;
int i,j,v;
memset(price,0,sizeof(price));
for(i=1;i<=n;i++){
cin>>price[0][i]>>lv[i]>>x[i];
for(j=1;j<=x[i];j++){
cin>>v;
cin>>price[v][i];
}
}
}
int dji(){
int i,j;
for(j=1;j<=n;j++){
dis[j]=price[0][j];
}
int k,minpath;
for(i=1;i<=n;i++){//能分块分函数写就尽量分函数写,防止变量设置重复
minpath=inf;
k=0;
for(j=1;j<=n;j++){
if(!vis[j]&&(dis[j]<minpath)){
//vis[i]=true;
minpath=dis[j];
k=j;
}
}
if(k==0){//由于等级的原因
break;
}
vis[k]=true;
for(j=1;j<=n;j++){
if(!vis[j]&&price[k][j]>0&&(dis[j]>(price[k][j]+dis[k]))){//price[k][j]>0代表k j之间有连线
dis[j]=price[k][j]+dis[k];
}
}
}
return dis[1];
}
void cal(){
int minp=inf,i,j;
dis[0]=0;
for(i=1;i<=n;i++){
int maxl=lv[i];
for(j=1;j<=n;j++){
if(lv[j]>maxl||maxl-lv[j]>m){
vis[j]=true;
}
else
vis[j]=false;
}
int di=dji();
if(di<minp){
minp=di;
}
}
cout<<minp;
}
int main(){
//freopen("D:\\INPUT.txt","r", stdin);
read_graph();
cal();
return 0;
}