思路:
- 正权,单向,最短路,Dijkstra。关键在提取建图思想。
- 第一次做以为酋长的地位一定最高,WA。
- 枚举起始等级,AC。
代码:
#include <iostream>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 105;
int mp[maxn][maxn];
int dis[maxn];
int M,N;
struct NODE{
int id;
int dis;
NODE(int id,int dis) : id(id) , dis(dis) {} ;
friend bool operator > (NODE a , NODE b){
return a.dis > b.dis;
}
};
priority_queue<NODE , vector<NODE> , greater<NODE> > Q;
int IJK(){
Q.push(NODE(0,0));
dis[0] = 0;
while(Q.size()){
NODE cur = Q.top() ; Q.pop();
if(cur.dis > dis[cur.id])
continue;
for(int i=1;i<=N;i++){
if(dis[i] > dis[cur.id] + mp[cur.id][i]){
dis[i] = dis[cur.id] + mp[cur.id][i];
Q.push(NODE(i , dis[i]));
}
}
}
return dis[1];
}
int main(){
memset(dis,INF,sizeof(dis));
memset(mp,INF,sizeof(mp));
for(int i=0;i<maxn;i++)
mp[i][i] = 0;
cin>>M>>N;
for(int i=1;i<=N;i++){
int l,num;
int k,w;
cin>>w>>l>>num;
if(i == 1){
M = l-M;
mp[0][i] = w;
}
else if(l >= M)
mp[0][i] = w;
while(num--){
cin>>k>>w;
if(l >= M)
mp[k][i] = w;
}
}
cout<<IJK()<<endl;
return 0;
}
#include <iostream>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 105;
int mp[maxn][maxn];
int dis[maxn];
int M,N;
int L[maxn];
struct NODE{
int id;
int dis;
NODE(int id,int dis) : id(id) , dis(dis) {} ;
friend bool operator > (NODE a , NODE b){
return a.dis > b.dis;
}
};
priority_queue<NODE , vector<NODE> , greater<NODE> > Q;
int IJK(int B){
memset(dis,INF,sizeof(dis));
Q.push(NODE(0,0));
dis[0] = 0;
while(Q.size()){
NODE cur = Q.top() ; Q.pop();
if(cur.dis > dis[cur.id])
continue;
for(int i=1;i<=N;i++){
if(L[i] >= B && L[i] <= B+M)
if(dis[i] > dis[cur.id] + mp[cur.id][i]){
dis[i] = dis[cur.id] + mp[cur.id][i];
Q.push(NODE(i , dis[i]));
}
}
}
return dis[1];
}
int main(){
memset(mp,INF,sizeof(mp));
for(int i=0;i<maxn;i++)
mp[i][i] = 0;
cin>>M>>N;
for(int i=1;i<=N;i++){
int num;
int k,w;
cin>>w>>L[i]>>num;
mp[0][i] = w;
while(num--){
cin>>k>>w;
mp[k][i] = w;
}
}
int ans=INF;
for(int i=L[1]-M ; i<=L[1] ; i++){
ans = min(ans , IJK(i));
}
cout<<ans<<endl;
return 0;
}