acdream1198 求很多人从某点出发,汇聚于某点,至少遍历所有点一次的最短时间
2014-09-09 11:20
246 查看
题目描述如题。
思路:从某点可以无限次出发,很像流的问题,开始时候用流,不行。
如此抽象出来问题(问题抽象出来就简单了,关键是如何转化和抽象):这个最短时间,其实是所有点从起点出发,经过一条路径(至少吧),去汇集点的过程,那么最短的时间必然是最长的那条路径(时间最长),若无需攻占所有点,那么直接是最短里,所以要攻占所有点,必然是max(起点到i,i到终点)(遍历i)。
思路:从某点可以无限次出发,很像流的问题,开始时候用流,不行。
如此抽象出来问题(问题抽象出来就简单了,关键是如何转化和抽象):这个最短时间,其实是所有点从起点出发,经过一条路径(至少吧),去汇集点的过程,那么最短的时间必然是最长的那条路径(时间最长),若无需攻占所有点,那么直接是最短里,所以要攻占所有点,必然是max(起点到i,i到终点)(遍历i)。
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; const int inf=0x3f3f3f3f; const int maxn=1001, maxe=200010; int head[maxn]; int nume=0;int e[maxe][3]; void inline adde(int i,int j,int w) { e[nume][0]=j;e[nume][1]=head[i];head[i]=nume; e[nume++][2]=w; e[nume][0]=i;e[nume][1]=head[j];head[j]=nume; e[nume++][2]=w; } int ds[maxn];int dt[maxn]; int n,m; void spfa(int s,int d[]) { int inq[maxn]; memset(inq,0,sizeof(inq)); d[s]=0; queue<int>q; q.push(s); while(!q.empty()) { int cur=q.front(); q.pop(); inq[cur]=0; for(int j=head[cur];j!=-1;j=e[j][1]) { int v=e[j][0]; if(d[v]>d[cur]+e[j][2]) { d[v]=d[cur]+e[j][2]; if(!inq[v]) { inq[v]=1; q.push(v); } } } } } int solve() { int minmax=0; for(int i=0;i<n;i++) { if(ds[i]+dt[i]>minmax) minmax=ds[i]+dt[i]; } return minmax; } void init() { nume=0; for(int i=0;i<n;i++) { head[i]=-1; ds[i]=inf; dt[i]=inf; } } int main() { int T; scanf("%d",&T);int ct=1; while(T--) { scanf("%d%d",&n,&m); init(); int aa,bb,cc; for(int i=0;i<m;i++) { scanf("%d%d%d",&aa,&bb,&cc); adde(aa,bb,cc); } int s,t; scanf("%d%d",&s,&t); spfa(s,ds); spfa(t,dt); int ans=solve(); printf("Case #%d: %d\n",ct++,ans); } return 0; }
相关文章推荐
- poj 2404 Jogging Trails 求走最少距离使得所有边至少都遍历一次并回到原点(即sum+加上最少多少距离使得原图变成欧拉回路) FLOYD+状态压缩DP
- hdu 3656 Fire station 重复覆盖 DLX+二分答案 给出一些城市及一些救火站的坐标,要求这些救火站覆盖所有的城市,问从救火站到城市的最长时间至少是多少。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- java 从开始时间到结束时间遍历一年所有时间
- 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度
- [LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- POJ 1125 可不可能遍历所有点情况下的最短路径
- hdu 3433 A Task Process N个人,第i个人完成一个A任务需要时间ai,完成一个B任务需要时间bi, 现在又X个任务A和Y个任务B,求完成所有任务所需要的最短时间。
- [LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现
- 所有节点对最短路径 超时 优先队列 + dijkstra + 遍历前驱子图
- (java)百度笔试之:求从某一点开始遍历所有点的最短距离
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- C#遍历时间范围内所有的时间
- hdu 4003 Find Metal Mineral K个机器人从S出发遍历树上所有点的经过的最小权值 树形DP
- 简单图论:遍历所有最短路径
- HDU 4003 Find Metal Mineral(树形dp,从根节点出发k个机器人遍历所有边的最小代价和)
- hdu 1599 find the mincost route(无向图的最小环:求从一个点遍历所有节点以后回到原点的最短路径)
- 为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从