BZOJ 1922--大陆争霸(最短路)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1922--大陆争霸(最短路)相关的知识,希望对你有一定的参考价值。
看起来很难的最短路。。。。
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1922
Solution
如果要要进入某个城市,首先要进入几个特定的点。。。
于是进入某个城市的时间就是到达该城市和进入其他特定城市的时间的最大值。。。
于是跑一遍最短路就好了。。。。
代码
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> #include<queue> #include<vector> using namespace std; const int INF=0x3f3f3f3f; int n,m; int d[3010],d1[3010],d2[3010],l[3010]; int a[3010][3010]; bool vis[3010]; priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q; struct edge{ int v,next,w; }e[70010]; int cnt,head[3010]; void insert(int u,int v,int w){ e[++cnt].v=v; e[cnt].next=head[u]; e[cnt].w=w; head[u]=cnt; } void dijkstra(){ memset(d1,0x3f,sizeof(d1)); q.push(make_pair(0,1)); d1[1]=0; while(!q.empty()){ int now=q.top().second; q.pop(); if(vis[now]) continue; vis[now]=1; int mx=max(d1[now],d2[now]); for(int i=head[now];i;i=e[i].next) if(mx+e[i].w<d1[e[i].v]){ d1[e[i].v]=mx+e[i].w; int tmp=max(d1[e[i].v],d2[e[i].v]); if(!d[e[i].v]) q.push(make_pair(tmp,e[i].v)); } for(int i=1;i<=l[now];i++){ int t=a[now][i]; d[t]--; d2[t]=max(d2[t],mx); int tmp=max(d1[t],d2[t]); if(!d[t]) q.push(make_pair(tmp,t)); } } printf("%d\n",max(d1[n],d2[n])); } int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); if(u!=v) insert(u,v,w); } for(int i=1;i<=n;i++){ scanf("%d",&d[i]); for(int j=1;j<=d[i];j++){ int u; scanf("%d",&u); a[u][++l[u]]=i; } } dijkstra(); return 0; }
This passage is made by Iscream-2001.
以上是关于BZOJ 1922--大陆争霸(最短路)的主要内容,如果未能解决你的问题,请参考以下文章