USACO4.13Fence Loops(无向图最小环)

最近脑子有点乱 老是不想清楚就啪啪的敲 敲完之后一看 咦。。样例都过不去 仔细一想 这样不对啊

刚开始就写了一SPFA 最后发现边跟点的关系没处理好 删了。。写dfs。。还是没转化好 开始搜解题方法 看到别人都说最小环 解最小环的方法跟我想的差不多 就是边转化点没处理好

又想了想 开个二维数组标记下 转化点 然后就枚举每条边的两个点间的最短距离 要先删了这条边 找个最小的就好了

dijk求最短路

 1 /*
 2     ID: shangca2
 3     LANG: C++
 4     TASK: fence6
 5  */
 6 #include <iostream>
 7 #include<cstdio>
 8 #include<cstring>
 9 #include<algorithm>
10 #include<stdlib.h>
11 using namespace std;
12 #define N 110
13 #define INF 0xfffffff
14 int f[N][N],w[N][N],t,o[N][3],vis[N],dis[N];
15 int n;
16 int init(int a,int c)
17 {
18     int i,u[10],k=0;
19     for(i = 1; i <= c ; i++)
20     {
21         cin>>u[i];
22         if(f[a][u[i]])
23         k = f[a][u[i]];
24     }
25     if(k==0)
26     {
27         t++;
28         k = t;
29     }
30     for(i = 1; i <= c ; i++)
31     f[u[i]][a] = k;
32     return k;
33 }
34 int dijk(int s,int e)
35 {
36     memset(vis,0,sizeof(vis));
37     int minz,k,i,j;
38     for(i = 1 ;i <= t ; i++)
39     dis[i] = INF;
40     dis[s] = 0;
41     for(i =1 ; i <= t ; i++)
42     {
43         minz = INF;
44         for(j = 1; j <= t ;j++)
45         if(!vis[j]&&dis[j]<minz)
46         minz = dis[k=j];
47         vis[k] = 1;
48         for(j = 1 ; j <= t ; j++)
49         if(w[k][j]+dis[k]<dis[j])
50         dis[j] = w[k][j]+dis[k];
51     }
52     return dis[e];
53 }
54 int main()
55 {
56     freopen("fence6.in","r",stdin);
57     freopen("fence6.out","w",stdout);
58     int i,a,b,c,d;
59     cin>>n;
60     memset(w,127,sizeof(w));
61     for(i = 1; i <= n ; i++)
62     {
63         cin>>a>>b>>c>>d;
64         int u = init(a,c);
65         int v = init(a,d);
66         w[u][v] = b;
67         w[v][u] = b;
68         o[i][0] = u;
69         o[i][1] = v;
70         o[i][2] = b;
71     }
72     int ans = INF;
73     for(i = 1; i <= n ; i++)
74     {
75         int u = o[i][0];
76         int v = o[i][1];
77         w[u][v] = INF;
78         w[v][u] = INF;
79         ans = min(ans,dijk(u,v)+o[i][2]);
80         w[u][v] = o[i][2];
81     }
82     cout<<ans<<endl;
83     return 0;
84 }
View Code
原文地址:https://www.cnblogs.com/shangyu/p/3279276.html