感谢@AC_vitasoy 的提醒。。看了看有个比较严重的错误漏洞。。好吧。。这数据这么弱好无奈(其实是自己写的搓)。
题意很简单。这题是真的可以做出来的。但是用set TLE了。。赛后才做出来的。。就差这么一题。。
其实早就想到这种做法。但是懒得写。。以为不会过。。没想到真不科学。。强行打脸。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <set> #include <vector> #include <map> #include <queue> #include <set> #include <algorithm> #include <limits> using namespace std; typedef long long LL; const int MAXN=1e+5+1000; const int INF = numeric_limits<int>::max(); const LL LL_INF= numeric_limits<LL>::max(); int n,m,a,b;
vector <int> e[MAXN]; inline void init(){ for(int i=0;i<=n;i++)e[i].clear(); } inline void AddEdge(int u,int v){ e[u].push_back(v); e[v].push_back(u); } int dis[MAXN]; int que[MAXN+1000],front,rear; inline int bfsa(){ for(int i=1;i<=n;i++)dis[i]=-1; dis[1]=0; front=rear=0; que[front++]=1; while(front!=rear){ int now=que[rear++]; if(now==n)break; int sz=e[now].size(); for(int i=0;i<sz;i++){ int to=e[now][i]; if(dis[to]==-1){ dis[to]=dis[now]+1; if(now==n)break; que[front++]=to; } } } return dis[n]; } inline int bfsb(){ for(int i=1;i<=n;i++)dis[i]=-1; dis[1]=0; front=rear=0; que[front++]=1; que[front++]=n; dis[n]=(0<<1)|1; while(front!=rear){ int now=que[rear++]; for(int i=2;i<=n;i++){ int pos=lower_bound(e[now].begin(),e[now].end(),i)-e[now].begin(); int sz=e[now].size(); if(pos==sz||sz==0||(pos<sz&&e[now][pos]!=i)){ if(dis[i]==-1){ dis[i]=(((dis[now]>>1)+1)<<1)|(dis[now]&1); que[front++]=i;
} else if((dis[i]&1)^(dis[now]&1)){ return (dis[i]>>1)+(dis[now]>>1)+1; } } } } return -1; } int main() { while(~scanf("%d%d%d%d",&n,&m,&a,&b)){ init(); int flag=0; for(int i=0,x,y;i<m;i++){ scanf("%d%d",&x,&y); if(x==1&&y==n)flag=1; if(x==n&&y==1)flag=1; AddEdge(x,y); } for(int i=1;i<=n;i++) sort(e[i].begin(),e[i].end()); LL atime,btime; atime=(LL)bfsa()*a; btime=(LL)bfsb()*b; LL ans; if(atime<0)ans=btime; else if(btime<0)ans=atime; else ans=min(atime,btime); printf("%lld\n",ans);
} return 0; }
|