Sample Input
3 2 1
2 2 3
2 3 1
2 1 2
Sample Output
0
注意使用priority queue优化时判断continue的位置,同时注意cmp重载的写法
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct edge{
int end;
int cost;
edge(int m,int n)
{
end = m;
cost = n;
}
};
vector<vector<edge> > edges(105);
vector<bool> visited(105);
vector<int> distances(105,0x3f3f3f3f);
struct cmp {
bool operator()(int a, int b)
{
return distances[a] > distances[b]; //比较函数可以用到全局变量
}
};
void dij(int N,int S)
{
priority_queue<int, vector<int>, cmp> q;
distances[S]=0;
q.push(S);
while(q.size())
{
int currNum = q.top();
q.pop();
if(visited[currNum])
continue;
visited[currNum]=true;
for(int j=0;j<edges[currNum].size();j++)
{
if(distances[edges[currNum][j].end]>distances[currNum]+edges[currNum][j].cost)
{
distances[edges[currNum][j].end]=distances[currNum]+edges[currNum][j].cost;
q.push(edges[currNum][j].end);
}
}
}
}
int main()
{
int N,A,B;
cin >> N >> A >> B;
for(int i=1;i<=N;i++)
{
int num;
cin >> num;
for(int j=0;j<num;j++)
{
int temp;
cin >> temp;
if(j==0)
edges[i].push_back(edge(temp,0));
else
edges[i].push_back(edge(temp,1));
}
}
dij(N,A);
if(distances[B]==0x3f3f3f3f)
distances[B]=-1;
cout << distances[B]<<endl;
return 0;
}