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;}


原创粉丝点击