首页 > 代码库 > AC日记——[SDOI2010]大陆争霸 洛谷 P3690
AC日记——[SDOI2010]大陆争霸 洛谷 P3690
[SDOI2010]大陆争霸
思路:
dijkstra模板;
代码:
#include <bits/stdc++.h>using namespace std;#define maxn 3005#define ll long long#define maxm 70002<<2#define INF 1e13struct NodeType { ll id,dis; bool operator<(const NodeType pos)const { return dis>pos.dis; }};ll n,m,E1[maxm],V1[maxm],W[maxm],head1[maxn];ll cnt1,cnt2,E2[maxm],V2[maxm],head2[maxn],dis1[maxn];ll dis2[maxn],du[maxn];bool vis[maxn];priority_queue<NodeType>que;inline void in(ll &now){ char Cget=getchar();now=0; while(Cget>‘9‘||Cget<‘0‘) Cget=getchar(); while(Cget>=‘0‘&&Cget<=‘9‘) { now=now*10+Cget-‘0‘; Cget=getchar(); }}void edge_add(ll u,ll v,ll w){ E1[++cnt1]=head1[u],V1[cnt1]=v,W[cnt1]=w,head1[u]=cnt1;}void edge_add(ll u,ll v){ E2[++cnt2]=head2[u],V2[cnt2]=v,head2[u]=cnt2;}NodeType node(ll id_,ll dis_){ NodeType res; res.id=id_,res.dis=dis_; return res;}int main(){ in(n),in(m);ll u,v,w; while(m--) in(u),in(v),in(w),edge_add(u,v,w); for(ll i=1;i<=n;i++) { in(u),dis1[i]=INF; while(u--) in(v),edge_add(v,i),du[i]++; } dis1[1]=dis2[1]=0,que.push(node(1,0)); while(!que.empty()) { NodeType now=que.top();que.pop(); if(vis[now.id]) continue; vis[now.id]=true; for(ll i=head1[now.id];i;i=E1[i]) { if(dis1[V1[i]]>max(dis1[now.id],dis2[now.id])+W[i]) { dis1[V1[i]]=max(dis1[now.id],dis2[now.id])+W[i]; if(!du[V1[i]]) que.push(node(V1[i],max(dis1[V1[i]],dis2[V1[i]]))); } } for(ll i=head2[now.id];i;i=E2[i]) { dis2[V2[i]]=max(dis2[V2[i]],max(dis1[now.id],dis2[now.id])); if(!(--du[V2[i]])) que.push(node(V2[i],max(dis1[V2[i]],dis2[V2[i]]))); } } cout<<max(dis1[n],dis2[n]); return 0;}
AC日记——[SDOI2010]大陆争霸 洛谷 P3690
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。