spfa变形
(要求的是2500ms,我是2秒多水过......)
补了差不多两个星期,终于做出来了。
#include<bits/stdc++.h>
#define inf 1000000000
const double pi=acos(-1.0);
using namespace std;
const int N=100010;
int n,m;
struct node{
int v;
int id;
set<int> s;
}d[100010];
int head[N],ver[400010],edge[400010],Next[400010],vis[N];
int tot;
void add(int x,int y,int z)
{
ver[++tot]=y;edge[tot]=z;Next[tot]=head[x];head[x]=tot;
}
void spfa()
{
queue<int> q;
d[1].v=0;
d[1].id=1;
q.push(1);
vis[1]=1;
while(!q.empty())
{
int x=q.front();
q.pop();
vis[x]=0;
for(int i=head[x];i;i=Next[i])
{
int y=ver[i],z=edge[i];
if(d[x].s.find(z)!=d[x].s.end())
{
if(d[y].v>d[x].v)
{
d[y].v=d[x].v;
d[y].s.clear();
d[y].s.insert(z);
if(vis[y]==0)
{d[y].id=y;q.push(y);vis[y]=1;}
}
else if(d[y].s.find(z)==d[y].s.end()&&d[y].v==d[x].v)
{
d[y].s.insert(z);
if(vis[y]==0)
{d[y].id=y;q.push(y);vis[y]=1;}
}
}
else
{
if(d[y].v>d[x].v+1)
{
d[y].v=d[x].v+1;
d[y].s.clear();
d[y].s.insert(z);
if(vis[y]==0)
{d[y].id=y;q.push(y);vis[y]=1;}
}
else if(d[y].s.find(z)==d[y].s.end()&&d[y].v==d[x].v+1)
{
d[y].s.insert(z);
if(vis[y]==0)
{d[y].id=y;q.push(y);vis[y]=1;}
}
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
tot=0;
for(int i=1;i<=n;i++)
{d[i].v=inf;d[i].s.clear();vis[i]=0;head[i]=0;}
for(int i=1;i<=m*2;i++)
{ver[i]=0;edge[i]=0;Next[i]=0;}
int x,y,z;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
spfa();
if(d[n].v==inf)
printf("-1\n");
else
printf("%d\n",d[n].v);
}
return 0;
}