zoukankan      html  css  js  c++  java
  • 最短路

    题源


     题面 (点号从0开始)

     


    看到是最短路,上个dijkstra

    然后发现 500万炸了

    我们看样例 发现边权为1或2

    如果是2,我们就把它拆成 两条边

    上个bfs


    写的时候发现有重边

    加了个 

    for(int i=head[u];i;i=edge[i].nxt) if(edge[i].v==v) continue;

    然后慢的一匹

    以前从来没有发现

    以后不要管什么重不重边


    Code

    #include<stdio.h>
    #include<queue>
    #include<string.h>
    #define For(i,a,b) for(register int i=(a);i<=(b);i++)
    using namespace std;
    const int maxn=1e7+10,s=1;
    int n,m,t,dis[maxn],cnt,head[maxn];
    inline int rd(){
        int x=0;char ch=getchar();
        for (;ch<'0'||ch>'9';ch=getchar());
        for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
        return x;
    }
    struct Edge{
        int v,nxt;
    }edge[maxn<<2];
    inline int add(int u,int v){
        edge[++cnt].v=v,edge[cnt].nxt=head[u],head[u]=cnt;
    }
    queue<int> q;
    bool vis[maxn];
    inline void bfs(){
        memset(dis,0x7f,sizeof(dis));
        dis[1]=0;q.push(1);
        while(!q.empty()){
            int x=q.front();
            q.pop();
            for(register int i=head[x];i;i=edge[i].nxt){
                int v=edge[i].v;
                if(dis[v]>dis[x]+1){
                    dis[v]=dis[x]+1;
                    q.push(v);
                }
                if(v==t) return ;
            }
        }
    }
    signed main(){
        //scanf("%d%d%d",&n,&m,&t);
        n=rd(),m=rd(),t=rd(),n++;
        For(i,1,m){
            int u=rd(),v=rd(),w=rd();//scanf("%d%d%d",&u,&v,&w);
            if(w==2){
                add(u,++n),add(n,u),add(v,n),add(n,v);
            }else add(u,v),add(v,u);
        }
        bfs();
        printf("%d
    ",dis[t]);
    }
  • 相关阅读:
    [Js]面向对象基础
    [css]邮件的写法
    [Js]碰撞运动
    [Js]弹性运动
    [Js]布局转换
    [Js]高级运动
    [js]多个物体的运动
    [Js]缓冲运动
    外部 Storage Provider【转】
    hostPath Volume【转】
  • 原文地址:https://www.cnblogs.com/monyhzc/p/12038588.html
Copyright © 2011-2022 走看看