最短路

题源


 

 题面 (点号从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]);
}
posted @ 2019-12-14 11:49  monyhzc  阅读(195)  评论(0编辑  收藏  举报