问题链接
link.
分析
虽然是道20年前的noip老题,难度不大。但是有许多细节点还是值得一说。
要点:
1.sstream库。
2.边权为1的最短路问题可以直接bfs求解。
3.经典建图方式。
建图方式:对于上游车站,向所有下游车站连一条边。答案就是从1号点到n号点的最短路-1。
处理输入:sstream库函数(随便看了看,还没怎么搞懂)。。
具体代码
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
int g[N][N];
int n,m;
int dist[N];
int bfs()
{
memset(dist,0x3f,sizeof dist);
queue<int> q;
q.push(1);
dist[1]=0;
while(q.size())
{
auto t = q.front();
q.pop();
for(int i=1;i<=n;i++)
{
if(g[t][i]==1&&dist[i]>dist[t]+1)
{
dist[i]=dist[t]+1;
q.push(i);
}
}
}
return dist[n];
}
int main()
{
cin>>m>>n;
cin.get();//读回车符
string line;
while( m -- )
{
getline(cin,line);
stringstream ssin(line);
vector<int> t;
int p;
while(ssin>>p) t.push_back(p);//读入数据
for(int i=0;i<t.size();i++)
{
for(int j=i+1;j<t.size();j++)
g[t[i]][t[j]]=1;
}
}
int ans=bfs();
if(ans==0x3f3f3f3f) puts("NO");
else
cout<<ans-1<<endl;
return 0;
}