POJ修好啦!
思路:
- Dijkstra,正权单向图。
- 仅权值有微小变化,非常简单。
代码:
#include <iostream>
#include <cstring>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 105;
int ans = -1;
int N,U,V;
int mp[maxn][maxn];
int dis[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;
void IJK(){
Q.push(NODE(U,0));dis[U] = 0;
while(Q.size()){
NODE cur = Q.top() ; Q.pop() ;
if(dis[cur.id] < cur.dis)
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]));
}
}
}
if(dis[V] != INF)
ans = dis[V];
return ;
}
int main(){
memset(dis,INF,sizeof(dis));
memset(mp,INF,sizeof(mp));
for(int i=1;i<maxn;i++)
mp[i][i]=0;
cin>>N>>U>>V;
for(int i=1;i<=N;i++){
int m;
cin>>m;
int v;
for(int j=1;j<=m;j++){
cin>>v;
if(j == 1)
mp[i][v] = 0;
else
mp[i][v] = 1;
}
}
IJK();
cout<<ans<<endl;
return 0;
}