通往奥格瑞玛的道路

[Time Gate] https://www.luogu.org/problemnew/show/P1462

【解题思路】

spfa+二分
二分的条件就是 以当前值为最大值 判断是否有一条路可以使得
每条边的收费都小于等于此值 并且 走到终点之后血量不会被扣光

【code】
 1 #include <cstdio>
 2 #include <queue>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define inf 0x3f3f3f3f3f
 6 using namespace std;
 7 struct node{
 8     int s;
 9     int nxt;
10     int endd;
11 }e[100005];
12 int h[100005],t;
13 int n,m,b,ans;
14 int dis[100005];
15 int x[100005],y[100005];
16 int q[100005],tail,head;
17 bool inq[100005];
18 void add(int u,int v,int x){
19     t++;
20     e[t].nxt=h[u];
21     h[u]=t;
22     e[t].endd=v;
23     e[t].s=x;
24 }
25 bool SPFA(int mid){
26     memset(dis,inf,sizeof(dis));
27     memset(inq,0,sizeof(inq));
28     queue <int> q;
29     inq[1]=true;
30     dis[1]=0;
31     q.push(1);
32     while(!q.empty()){
33         int top=q.front();
34         q.pop();
35         inq[top]=false;
36         for(int i=h[top];i!=0;i=e[i].nxt){
37             int v=e[i].endd;
38             if(dis[v]>dis[top]+e[i].s&&x[v]<=mid){
39                 dis[v]=dis[top]+e[i].s;
40                 if(!inq[v]){
41                     inq[v]=true;
42                     q.push(v);
43                 }
44             }
45         }
46     }
47     if(dis[n]<=b)return true;
48     else return false;
49 }
50 int main(){
51     //freopen("1462.in","r",stdin);
52     //freopen("1462.out","w",stdout);
53     scanf("%d%d%d",&n,&m,&b);
54     for(register int i=1;i<=n;i++){
55         scanf("%d",&x[i]);
56         y[i]=x[i];
57     }
58     int cnt=0;
59     for(register int i=1;i<=m;i++){
60         int u,v,s;
61         scanf("%d%d%d",&u,&v,&s);
62         add(u,v,s);
63         add(v,u,s);
64     }
65     sort(y+1,y+n+1);
66     if(SPFA(inf)==false){
67         printf("AFK\n");
68         return 0;
69     } 
70     int l=1,r=n;
71     while(l<=r){
72         int mid=l+r>>1;
73         if(SPFA(y[mid])){
74             ans=y[mid];
75             r=mid-1;
76         }
77         else l=mid+1; 
78     } 
79     printf("%d\n",ans);
80     return 0;
81 }
 1 #include <cstdio>
 2 #include <queue>
 3 #include <cstring>
 4 #include <algorithm>
 5 #define inf 0x3f3f3f3f3f
 6 using namespace std;
 7 struct node{
 8     int s;
 9     int nxt;
10     int endd;
11 }e[100005];
12 int h[100005],t;
13 int n,m,b,ans;
14 int dis[100005];
15 int x[100005],y[100005];
16 int q[100005],tail,head;
17 bool inq[100005];
18 void add(int u,int v,int x){
19     t++;
20     e[t].nxt=h[u];
21     h[u]=t;
22     e[t].endd=v;
23     e[t].s=x;
24 }
25 bool SPFA(int mid){
26     memset(dis,inf,sizeof(dis));
27     memset(inq,0,sizeof(inq));
28     queue <int> q;
29     inq[1]=true;
30     dis[1]=0;
31     q.push(1);
32     while(!q.empty()){
33         int top=q.front();
34         q.pop();
35         inq[top]=false;
36         for(int i=h[top];i!=0;i=e[i].nxt){
37             int v=e[i].endd;
38             if(dis[v]>dis[top]+e[i].s&&x[v]<=mid){
39                 dis[v]=dis[top]+e[i].s;
40                 if(!inq[v]){
41                     inq[v]=true;
42                     q.push(v);
43                 }
44             }
45         }
46     }
47     if(dis[n]<=b)return true;
48     else return false;
49 }
50 int main(){
51     //freopen("1462.in","r",stdin);
52     //freopen("1462.out","w",stdout);
53     scanf("%d%d%d",&n,&m,&b);
54     for(register int i=1;i<=n;i++){
55         scanf("%d",&x[i]);
56         y[i]=x[i];
57     }
58     int cnt=0;
59     for(register int i=1;i<=m;i++){
60         int u,v,s;
61         scanf("%d%d%d",&u,&v,&s);
62         add(u,v,s);
63         add(v,u,s);
64     }
65     sort(y+1,y+n+1);
66     if(SPFA(inf)==false){
67         printf("AFK\n");
68         return 0;
69     } 
70     int l=1,r=n;
71     while(l<=r){
72         int mid=l+r>>1;
73         if(SPFA(y[mid])){
74             ans=y[mid];
75             r=mid-1;
76         }
77         else l=mid+1; 
78     } 
79     printf("%d\n",ans);
80     return 0;
81 }

 

 
posted @ 2019-07-15 12:22  GTR_PaulFrank  阅读(125)  评论(0编辑  收藏  举报