usaco Fence Loops
来源:互联网 发布:益友电台第一台网络 编辑:程序博客网 时间:2024/06/08 11:21
1.floyd求最小环。设环中有最大编号的点为k,其邻接点为i,j,则以k为环最大编号点的环的最小长度为
answer = g[k][i] + g[k][j] + i到j的最短路[路径中的节点编号小于k]
2.构造图(难点)。
输入边的信息。
len[i] 记录第i条边的长度
边表 adj[n][2][n]记录第i条边第0、1端第j条边的编号edge[i][2] 记录第i条边两端邻接的边数
matrix[i][j] 记录第j条边位于第i条边的哪一端g[i][j] 用于表示邻接矩阵
dist[i][j] 记录最短路径思路:
输入边的信息,然后用matrix记录各个边之间的关系,枚举边对其两端点构造节点编号,并更新其邻接边的相应的端点的节点编号,然后通过floyd求最短路求出最小环的长度
参考:dd usaco/* ID: daijinq1 PROB:fence6 LANG: C++ */#include <iostream>#include <algorithm>#include <sstream>#include <cstring>#include <cstdio>using namespace std;#define FOR(i,a,b) for(i = (a); i < (b); ++i)#define FORE(i,a,b) for(i = (a); i <= (b); ++i)#define FORD(i,a,b) for(i = (a); i > (b); --i)#define FORDE(i,a,b) for(i = (a); i >= (b); --i)#define CLR(a,b) memset(a,b,sizeof(a))const int MAXN = 110;const int INF = 0x7f7f7f7f;int N;int cnt;int end;int answer;int len[MAXN];int adj[MAXN][2][MAXN];int edge[MAXN][2];int matrix[MAXN][MAXN];int edge_point[MAXN][2];int g[MAXN][MAXN];int dist[MAXN][MAXN];void floyd() { int i, j, k; answer = 10000000; FOR(i, 1, cnt) FOR(j, 1, cnt) dist[i][j] = g[i][j]; FOR(k, 1, cnt) { FOR(i, 1, k) FOR(j, i + 1, k) answer = min(answer, g[i][k] + g[k][j] + dist[i][j]); FOR(i, 1, cnt) FOR(j, 1, cnt) dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); }}void makepoint(int l, int side, int cnt) { int i; edge_point[l][side] = cnt; FORE(i, 1, edge[l][side]) { int x = adj[l][side][i]; if(matrix[x][l] == 0) edge_point[x][0] = cnt; else edge_point[x][1] = cnt; }}void makegraph() { int i, j; cnt = 1; CLR(edge_point, -1); FORE(i, 1, N) { if(edge_point[i][0] == -1) makepoint(i, 0, cnt++); if(edge_point[i][1] == -1) makepoint(i, 1, cnt++); } FOR(i, 1, cnt) FOR(j, 1, cnt) g[i][j] = 10000000; FORE(i, 1, N) g[edge_point[i][0]][edge_point[i][1]] = g[edge_point[i][1]][edge_point[i][0]] = len[i]; floyd(); printf("%d\n", answer);}void input() { int i, j, k, l; scanf("%d", &N); FORE(i, 1, N) { scanf("%d", &l); scanf("%d %d %d ", &len[l], &edge[l][0], &edge[l][1]); FORE(k, 0, 1) FORE(j, 1, edge[l][k]) { scanf("%d", &adj[l][k][j]); matrix[l][adj[l][k][j]] = k; } }}int main() { freopen("fence6.in", "r", stdin); freopen("fence6.out", "w", stdout); input(); makegraph(); floyd(); return 0;}
- usaco Fence Loops
- usaco Fence Loops
- USACO Fence Loops 解题报告
- USACO 4.1 Fence Loops (fence6)
- USACO Section 4.1 Fence Loops
- usaco 4.1.3 Fence Loops
- usaco 4.1 Fence Loops 最小环
- USACO 4.1.3 Fence Loops解题报告
- USACO 4.1 Fence Loops 最小环
- usaco 4.1.3 Fence Loops (floyd)做法
- Fence Loops
- USACO Section 4.1 Fence Loops - 简单深搜~
- usaco 4.1 Fence Loops(floyd求最小环)
- 【USACO题库】4.1.3 Fence Loops篱笆回路
- C++——【USACO 4.1.2】——Fence Loops
- USCAO Chap4 Fence Loops
- Section 4.1 Fence Loops
- usaco4.1.2 Fence Loops
- [IOI2000]快乐的蜜月
- Oracle APEX级联LOV:Cascading LOVs/Select Lists
- vc编程遇到的各种问题和解决方法
- C++头文件的包含顺序研究
- 查询国际学术会议的信息
- usaco Fence Loops
- 关于std::fstream以及std::ifstream打开中文路径名失败的问题和解决方法
- Ubuntu IP 相关设置
- linux下编程经历[0]
- 通过JDBC连接数据库(二)
- Android Application Task Activities的关系
- visio 中取消 交叉连接线的拱形的方法
- zoj 2376 Ants
- 左连接、右连接和全连接的区别