摘要: 题意: 给出一个 有 n 个节点,m 条边的的有向图,求图中的次短路,如果有超过两条以上的最短路,那么次短路的长度即为最短路的长度。分析: 可以先求出最短路,并保存路径,从 i 到 j 次短路的构成可以用 i 到 点k的次短路加上k 到j 的最短路构成,而i 到 k 的次短路也是通过同样的方法求出, 因此可以通过枚举不在最短路上的边来依次推出 1 到 2..n 的次短路。#include<stdio.h>#include<string.h>#include<stdlib.h>#define INF 0x1f1f1f1fint g[1003][1003];in 阅读全文
posted @ 2012-08-06 17:38 'wind 阅读(180) 评论(0) 推荐(0) 编辑
摘要: #include<stdio.h>#include<string.h>#include<stdlib.h>#include<queue>#define clr(x)memset(x,0,sizeof(x))using namespace std;#define INF 0x1f1f1f1fstruct node{ int from,to,next,w;}e[1000000];int tot;int head[5003];void add(int s,int t,int wi){ e[tot].from=s; e[tot].to=t; e[tot] 阅读全文
posted @ 2012-08-06 15:10 'wind 阅读(208) 评论(0) 推荐(0) 编辑
摘要: 题意:有以个 有 N 个节点的树形地图,问在这些顶点上最少建多少个电话杆,可以使得所有顶点被覆盖到,一个节点如果建立了电话杆,那么和它直接相连的顶点也会被覆盖到。分析:用最少的点覆盖所有的点,即为求最少支配集。 可以用树形DP。① dp[r][0] += min(dp[i][0],dp[i][1],dp[i][2]) dp[r][0]表示在自 r 顶点自身建, 以 r为根节点的树所需要的最少覆盖数。② dp[r][1] += min(dp[i][0],dp[i][1])dp[r][1]表示在r的子节点建, 以 r为根节点的树所需要的最少覆盖数。③ dp[r][2] += min(dp[i][0 阅读全文
posted @ 2012-08-06 10:03 'wind 阅读(941) 评论(0) 推荐(0) 编辑