题面 (点号从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]); }