HDU 6386 SPFA变形

HDU 6386

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值