HDU - 6386 Age of Moyu (双端队列+bfs)

题目链接

双端队列跑边,颜色相同的边之间的花费为0,放进队首;不同的花费为1,放进队尾。

用Dijkstra+常数优化也能过

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int N=4e5+10,mod=1e9+7;
 5 int n,m,hd[N],ne,dp[N];
 6 struct E {int v,c,nxt;} e[N];
 7 void addedge(int u,int v,int c) {e[ne]= {v,c,hd[u]},hd[u]=ne++;}
 8 deque<int> q;
 9 int solve() {
10     q.clear();
11     memset(dp,-1,sizeof dp);
12     q.push_back(ne-1),dp[ne-1]=0;
13     while(q.size()) {
14         int u=q.front(),now=dp[u],cu=e[u].c;
15         q.pop_front();
16         if(e[u].v==n)return now;
17         for(int v=hd[e[u].v]; ~v; v=e[v].nxt) {
18             int cv=e[v].c;
19             if(!~dp[v]) {
20                 if(cv==cu)dp[v]=now,q.push_front(v);
21                 else dp[v]=now+1,q.push_back(v);
22             }
23         }
24     }
25     return -1;
26 }
27 int main() {
28     while(scanf("%d%d",&n,&m)==2) {
29         memset(hd,-1,sizeof hd),ne=0;
30         while(m--) {
31             int u,v,c;
32             scanf("%d%d%d",&u,&v,&c);
33             addedge(u,v,c);
34             addedge(v,u,c);
35         }
36         addedge(1,1,0);
37         printf("%d\n",solve());
38     }
39     return 0;
40 }

 

转载于:https://www.cnblogs.com/asdfsag/p/11287234.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值