自己看吧。。。http://www.cnblogs.com/ACMan/archive/2012/10/07/2713690.html
我都不知道为什么总是栈溢出。。。
哎 栈溢出 超时 越界 我发现这些真的比wa更可恶啊!!!! 总是不知道错在哪儿了
错的代码


#include <stdio.h> #include <string> #include <queue> using std::sort; using std::queue; const int INF = 0x3f3f3f3f, MAXN = 3005, MAXM = MAXN*MAXN; int n, m, fa[MAXN], cnt, dp[MAXN][MAXN], no[MAXN][MAXN]; bool vis[MAXN], used[MAXN][MAXN]; int ans[MAXN][MAXN], g[MAXN][MAXN], origin; queue<int> q, q2; struct Edge { int a, b, c; bool operator < (Edge a) { return c <= a.c; } }edge[MAXM]; int find(int t) { if(t == fa[t]) return t; else return fa[t] = find(fa[t]); } int head[MAXN], size; struct node { int next, index; }mst[MAXN]; int minz(int a,int b) { return a<=b ?a : b; } void krusal() { sort(edge, edge+m); for(int i=0; i<m; i++) { Edge &e = edge[i]; int fx = find(edge[i].a); int fy = find(edge[i].b); if(fx != fy) { used[e.a][e.b] = used[e.b][e.a] = 1; mst[++size].index = e.b; mst[size].next = head[e.a]; head[e.a] = size; mst[++size].index = e.a; mst[size].next = head[e.b]; head[e.b] = size; fa[fx] = fy; origin += e.c; } } } int dfs(int pos, int root, int fa) { dp[pos][root] = g[pos][root]; no[pos][root] = INF; for(int i=head[root]; i!=-1; i=mst[i].next) { int index = mst[i].index; if(index == fa) continue; int temp = dfs(pos, index, root); dp[pos][root] = minz(dp[pos][root], temp); no[pos][root] = minz(no[pos][root], temp); } return dp[pos][root]; } int dfs2(int pos, int root, int fa) { int res = INF; if(fa != pos) res = dp[pos][root]; for(int i=head[root]; i!=-1; i=mst[i].next) { if(mst[i].index == fa ) continue; res = minz(dfs2(pos, mst[i].index, root), res); } return res; } void solve() { int i, j; for(i=0; i<n; i++) for(j=head[i]; j!=-1; j=mst[j].next) dfs(i, mst[j].index, i); for(i=0; i<n; i++) for(j=head[i]; j!=-1; j=mst[j].next) { int v = mst[j].index; if(ans[i][v] > 0) continue; ans[i][v] = ans[v][i] = minz(no[i][v], dfs2(i, v, i)); } } int main() { int sum, i, j, q, a, b, c; while(scanf("%d %d", &n, &m), n|m) { sum = origin = size = 0; for(i=0; i<n; i++) for(j=0; j<n; j++) { g[i][j] = g[j][i] = i==j ?0 : INF; used[i][j] = used[j][i] = 0; ans[i][j] = ans[j][i] = 0; // ans[i][j] = ans[j][i] = 0; } for(i=0; i<n; i++) fa[i] = i, head[i] = -1; for(i=0; i<m; i++) { scanf("%d %d %d", &a, &b, &c); g[a][b] = g[b][a] = c; edge[i].a = a, edge[i].b = b, edge[i].c = c; } krusal(); solve(); scanf("%d", &q); int round = q; while(q--) { scanf("%d %d %d", &a, &b, &c); if(used[a][b] == 0) sum += origin; else sum += origin - g[a][b] + minz(c, ans[a][b]); } printf("%.4lf\n", sum*1.0/round); } return 0; }