HDU 4126 Genghis Khan the Conqueror

自己看吧。。。http://www.cnblogs.com/ACMan/archive/2012/10/07/2713690.html

我都不知道为什么总是栈溢出。。。

哎 栈溢出 超时 越界  我发现这些真的比wa更可恶啊!!!! 总是不知道错在哪儿了

错的代码

View Code
#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;
}

 

转载于:https://www.cnblogs.com/crisxyj/archive/2013/04/02/2995610.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值