Travel

The country frog lives in has 1,2,…,n.

Among b minutes to travel.

Find the minimum time to travel from town n.

Input

The input consists of multiple tests. For each test:

The first line contains 1≤ui,vi≤n,ui≠vi).

Output

For each test, write 1 integer which denotes the minimum time.

Sample Input

3 2 1 3

1 2

2 3

3 2

2 3 1 2

2 3

Sample Output

2

3

 

//题意: n , m, a, b ,其中 n 代表点数,并且是个完全图,m 是权值为 a 的边数,其余的边权值为 b ,问 1--n 的最短路

 

题解:如果 1 和 n 之间连边为 a 那么答案一定为 a 与一条最短的全由b组成的路径的较小者,如果 1 和 n 之间连边为b,那么答案一定 

为b和一条最短的全由a组成的路径的较小者。对于第1种情况直接bfs就可以,第二种情况由于边数较多,不能直接bfs 

从1开始搜索与其相连的边权为b的边,用set维护一下,由于每个点只入队1次,复杂度算是 nlogn ,叉姐的题很有意思

300ms

  1 # include <cstdio>
  2 # include <cstring>
  3 # include <cstdlib>
  4 # include <iostream>
  5 # include <vector>
  6 # include <queue>
  7 # include <stack>
  8 # include <map>
  9 # include <bitset>
 10 # include <sstream>
 11 # include <set>
 12 # include <cmath>
 13 # include <algorithm>
 14 # pragma  comment(linker,"/STACK:102400000,102400000")
 15 using namespace std;
 16 # define LL          long long
 17 # define pr          pair
 18 # define mkp         make_pair
 19 # define lowbit(x)   ((x)&(-x))
 20 # define PI          acos(-1.0)
 21 # define INF         0x3f3f3f3f3f3f3f3f
 22 # define eps         1e-8
 23 # define MOD         1000000007
 24 
 25 inline int scan() {
 26     int x=0,f=1; char ch=getchar();
 27     while(ch<'0'||ch>'9'){if(ch=='-') f=-1; ch=getchar();}
 28     while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
 29     return x*f;
 30 }
 31 inline void Out(int a) {
 32     if(a<0) {putchar('-'); a=-a;}
 33     if(a>=10) Out(a/10);
 34     putchar(a%10+'0');
 35 }
 36 # define MX 100005
 37 /**************************/
 38 struct Edge
 39 {
 40     int v,nex;
 41 }edge[MX*10];
 42 
 43 int n,m,a,b,ip;
 44 int hlist[MX];
 45 LL dis[MX];
 46 bool vis[MX];
 47 void addedge(int u,int v)
 48 {
 49     edge[ip]= (Edge){v,hlist[u]};
 50     hlist[u]=ip++;
 51     edge[ip]= (Edge){u,hlist[v]};
 52     hlist[v]=ip++;
 53 }
 54 
 55 void bfsB() // 1-n 连b边
 56 {
 57     dis[n]=INF;
 58     memset(vis,0,sizeof(vis));
 59     queue<int> Q;
 60     Q.push(1);
 61     dis[1]=0;
 62     vis[1]=1;
 63     while (!Q.empty())
 64     {
 65         int u = Q.front(); Q.pop();
 66         for (int i=hlist[u];i!=-1;i=edge[i].nex)
 67         {
 68             int v = edge[i].v;
 69             if (!vis[v])
 70             {
 71                 dis[v]=dis[u]+1;
 72                 Q.push(v);
 73                 vis[v]=1;
 74             }
 75         }
 76         if (dis[n]!=INF) break;
 77     }
 78     printf("%lld\n",min(dis[n]*a,(LL)b));
 79 }
 80 
 81 void bfsA() //1-n 连 a 边
 82 {
 83     dis[n]=INF;
 84     set<int> st,ts;
 85     for (int i=2;i<=n;i++) st.insert(i);
 86     set<int>::iterator it;
 87     queue<int> Q;
 88     Q.push(1);
 89     dis[1]=0;
 90     while (!Q.empty())
 91     {
 92         int u = Q.front(); Q.pop();
 93         for (int i=hlist[u];i!=-1;i=edge[i].nex)
 94         {
 95             int v=edge[i].v;
 96             if (st.count(v)==0) continue;
 97             st.erase(v); ts.insert(v);
 98         }
 99         for (it=st.begin();it!=st.end();it++)
100         {
101             dis[*it] = dis[u]+1;
102             Q.push(*it);
103         }
104         if (dis[n]!=INF) break;
105         st.swap(ts);
106         ts.clear();
107     }
108     printf("%lld\n",min(dis[n]*b,(LL)a));
109 }
110 
111 
112 int main()
113 {
114     while(scanf("%d%d%d%d",&n,&m,&a,&b)!=EOF)
115     {
116         memset(hlist,-1,sizeof(hlist));
117         ip=0;
118         bool flag=0;
119         for (int i=0;i<m;i++)
120         {
121             int u = scan();
122             int v = scan();
123             addedge(u,v);
124             if (u>v) swap(u,v);
125             if (u==1&&v==n) flag=1;
126         }
127         if (flag)
128         {
129             if (a<b) printf("%d\n",a);
130             else bfsA();
131         }
132         else
133         {
134             if (b<a) printf("%d\n",b);
135             else bfsB();
136         }
137     }
138     return 0;
139 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-01-13
  • 2021-11-02
  • 2022-01-10
  • 2021-12-16
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-18
  • 2022-02-20
  • 2021-06-30
  • 2022-01-28
相关资源
相似解决方案