hdu 3873(有节点保护的最短路)
2013-05-28 13:26
761 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3873
思路:题目意思很简单,就是说如果没有攻占保护x的城市,就不能攻占,我们可以用pro[x]记录保护x的所有城市被攻占的最早时间,那么能到x的最短时间为pro[x]和到达x的最短路中的较大者 .dij入队过程中只把In[x](没有被包含的城市)入队 对于出队的x,它的最短时间已经确定,表示已经被占领,它所保护的城市的保护度减 1,一旦某个被保护的城市的保护度为零且已经到底(未占领,d[x]!=inf),就可以确定到达它的 最短时间(为max(pro[x],dist[x])),它也就到了入队的时机。
View Code
思路:题目意思很简单,就是说如果没有攻占保护x的城市,就不能攻占,我们可以用pro[x]记录保护x的所有城市被攻占的最早时间,那么能到x的最短时间为pro[x]和到达x的最短路中的较大者 .dij入队过程中只把In[x](没有被包含的城市)入队 对于出队的x,它的最短时间已经确定,表示已经被占领,它所保护的城市的保护度减 1,一旦某个被保护的城市的保护度为零且已经到底(未占领,d[x]!=inf),就可以确定到达它的 最短时间(为max(pro[x],dist[x])),它也就到了入队的时机。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> #include<algorithm> using namespace std; typedef long long LL; typedef pair<LL,int>Pair; #define inf (1ll)<<55 #define MAXN 3333 struct Node { int v,w; }; int In[MAXN]; LL dist[MAXN],pro[MAXN]; bool mark[MAXN]; vector<Node>Map[MAXN]; vector<int>vet[MAXN]; int n,m; void Dijkstra(){ for(int i=1;i<=n;i++){ dist[i]=inf;pro[i]=0; } dist[1]=0; memset(mark,false,sizeof(mark)); priority_queue<Pair,vector<Pair>,greater<Pair> >Q; Q.push(make_pair(dist[1],1)); while(!Q.empty()){ Pair pp=Q.top(); Q.pop(); int u=pp.second; if(mark[u])continue; mark[u]=true; for(int i=0;i<vet[u].size();i++){ int v=vet[u][i]; In[v]--; pro[v]=max(pro[v],dist[u]); if(dist[v]!=inf&&In[v]==0){ dist[v]=max(dist[v],pro[v]); Q.push(make_pair(dist[v],v)); } } for(int i=0;i<Map[u].size();i++){ int v=Map[u][i].v; int w=Map[u][i].w; if(dist[v]>dist[u]+w){ dist[v]=max(dist[u]+w,pro[v]); if(In[v]==0){ Q.push(make_pair(dist[v],v)); } } } } } int main() { int _case,u,v,w,x; scanf("%d",&_case); while(_case--) { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) { Map[i].clear(); vet[i].clear(); } while(m--) { scanf("%d%d%d",&u,&v,&w); Node p; p.v=v,p.w=w; Map[u].push_back(p); } for(int i=1; i<=n; i++) { scanf("%d",&In[i]); for(int j=1; j<=In[i]; j++) { scanf("%d",&x); vet[x].push_back(i); } } Dijkstra(); printf("%I64d\n",dist ); } return 0; }
View Code
相关文章推荐
- hdu 3873 Invade the Mars 有保护节点的最短路
- hdu 3873(有节点保护的最短路)
- HDU 3873 带保护节点的最短路
- Invade the Mars HDU - 3873(最短路变体)
- 【HDU】3873 Invade the Mars 最短路
- hdu 3873(限制最短路---待解决)
- HDU 3873 Invade the Mars 【思维好题 + 最短路】
- HDU 5521 Meeting(虚拟节点+最短路)
- HDU 3873 Invade the Mars dijkstra最短路变形
- (阶段三 dijkstra算法温习1.1)HDU 2544 最短路(利用dijkstra算法计算两个节点间的最短路径)
- Invade the Mars HDU - 3873 (最短路)题解
- 【HDU3873 Invade the Mars】有保护节点的最短路(优先队列+spfa)
- HDU 3873 必须写一个解题报告,很神奇的最短路
- hdu3873带节点保护的最短路
- hdu 3873 Invade the Mars(dij变体,带限制最短路)
- hdu 3873 Invade the Mars(有限制的最短路 spfa+容器)
- hdu 1874 畅通工程续(最短路spfa邻接矩阵)
- HDU 3873 Invade the Mars
- HDU 2066 一个人的旅行【最短路 dijkstra & floyed & SPFA 】
- hdu 2448 Mining Station on the Sea(最短路+费用流)