#include<iostream> #include<cstring> #include<cmath> #include<cstdio> using namespace std; struct Node{ int p,l,x; int di[105]; int d[105]; }node[105]; int m; int visit[105]; int dis[105]; int data[105][105]; void dijkstra(){ } int main(){ int n,mind,mini; scanf("%d%d",&m,&n); memset(data,0,sizeof data); for(int i=1;i<=n;i++){ scanf("%d%d%d",&node[i].p,&node[i].l,&node[i].x); data[i][i] = node[i].p; for(int j=1;j<=node[i].x;j++){ scanf("%d%d",&node[i].di[j],&node[i].d[j]); data[i][node[i].di[j]] = node[i].d[j]; } } // for(int i=1;i<=n;i++){ // cout<<node[i].l<<endl; // } dis[1] = data[1][1]; for(int i=2;i<=n;i++){ if(data[1][i]!=0&&abs(node[1].l-node[i].l)<=m){ dis[i] = data[1][i]+data[i][i]; } else{ dis[i] = 2147483647; } } visit[1] = 1; for(int k=2;k<=n;k++){ mind = 2147483647; mini = -1; for(int i=2;i<=n;i++){ if(abs(node[i].l-node[1].l)<=m&&data[1][i]!=0&&visit[i]==0){ if(mind>data[1][i]+data[i][i]){ mini = i; mind = data[1][i]+data[i][i]; } } } if(mini==-1)continue; dis[mini] = mind; visit[mini] = 1; for(int i=2;i<=n;i++){ if(i!=mini&&abs(node[1].l-node[i].l)<=m&&data[mini][i]!=0&&mind-data[mini][mini]+data[mini][i]+data[i][i]<dis[i]){ dis[i] = mind-data[mini][mini]+data[mini][i]+data[i][i]; data[1][i] = dis[i]-data[i][i]; } } } mind = dis[1]; for(int i=2;i<=n;i++){ if(mind>dis[i]){ mind = dis[i]; } } cout<<mind<<endl; return 0; }
原文:https://www.cnblogs.com/stevenzrx/p/15158599.html