首页 > 其他 > 详细

最短路

时间:2019-12-14 13:07:40      阅读:73      评论:0      收藏:0      [点我收藏+]

题源


 

 题面 (点号从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\n",dis[t]);
}

最短路

原文:https://www.cnblogs.com/monyhzc/p/12038588.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!