权全1 所以一拍脑子写了个 dijstra 然后456WA
怀疑是dij写炸了就把P4779的板子搬过来了,依旧过不了4 5 6
求问一下 是我写的有问题 还是这个思路有问题?
#include <cstdio>
#include <algorithm>
#include <queue>
#define int long long
using namespace std;
struct EDGE{
int l;
int to;
}edge_now[10000];
int head[60];
int cnt;
void add(int start,int end)
{
cnt++;
edge_now[cnt].l=head[start];
edge_now[cnt].to=end;
head[start]=cnt;
}
typedef pair<int,int> P;
priority_queue <P,vector<P>,greater<P> > q;
int vis[60];
int dis[60];
void dijkstra()
{
dis[1]=0;
q.push(make_pair(dis[1],1));
while(!q.empty())
{
int point=q.top().second;
q.pop();
if(vis[point]==1)continue;
vis[point]=1;
for(int i=head[point];i;i=edge_now[i].l)
{
dis[edge_now[i].to]=min(dis[edge_now[i].to],dis[point]+1);
q.push(make_pair(dis[edge_now[i].to],edge_now[i].to));
}
}
}
int n,m;
int a1,b1;
int edge[60][60][65];
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&a1,&b1);
edge[a1][b1][0]=1;
}
for(int k=1;k<=64;k++)
{
for(int p1=1;p1<=n;p1++)
{
for(int p2=1;p2<=n;p2++)
{
for(int p3=1;p3<=n;p3++)
{
if(edge[p1][p3][k-1]&&edge[p3][p2][k-1])
{
edge[p1][p2][k]=1;
}
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=0;k<=64;k++)
{
if(edge[i][j][k]==1)
add(i,j);
}
}
}
for(int i=2;i<=n;i++)dis[i]=0x3f3f3f;
dis[1]=0;
q.push(make_pair(0,1));
dijkstra();
printf("%lld",dis[n]);
return 0;
}