题意:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1092
把每一个点的出度-1作为该点的到该点的边的权值。到终点的边的权值是0。然后就是求最短路了。Dijkstra 可以过。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int N = 10009;
const int M = 100009;
const int INF = 0x3f3f3f3f;
struct LL{
int to,nex;
}L[M];
struct nod{
int dis,to;
bool operator<(const nod t) const
{
return dis>t.dis;
}
};
int F[N] ,cnt ;
int re[N];
int n,m;
int v[N];
void add(int f,int t)
{
L[cnt].nex = F[f];
L[cnt].to = t;
F[f] = cnt;cnt++;
}
void init()
{
int f,t;
memset(F,0,sizeof(F));
cnt = 1;
memset(v,0,sizeof(v));
for(int i=0;i<m;i++)
{
scanf("%d%d",&f,&t);
v[f]++;
add(f,t);
}
for(int i=1;i<=n;i++)
re[i] = v[i]-1;
re[n]=0;
}
int dis[N];
bool visit[N] ;
void solve()
{
memset(dis,INF,sizeof(dis));
memset(visit,false,sizeof(visit));
priority_queue<nod> que;
while(!que.empty()) que.pop();
nod e,t;
e.to = 1,e.dis =re[1];
que.push(e);
while(!que.empty())
{
e = que.top();
que.pop();
if(visit[e.to]) continue;
visit[e.to] = true;
//cout<<e.to<<" "<<e.dis<<endl;
dis[e.to] = e.dis;
for(int i=F[e.to];i;i=L[i].nex)
{
int to = L[i].to;
if(!visit[to]&&dis[to]>dis[e.to]+re[to])
{
dis[to]=dis[e.to]+re[to];
t.dis = dis[to];
t.to = to;
que.push(t);
}
}
}
if(dis[n]==INF)
{
printf("-1\n");
}else
{
printf("%d\n",dis[n]);
}
}
int main()
{
freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
init();
solve();
}
return 0;
}