栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 4006 Genghis Khan the Con...

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 4006 Genghis Khan the Con...

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int N = 3010;int d[N],f[N];bool v[N];int n,m,x,y,z;int a[N][N];int dfn[N];int curr;int b[N][N];int prim(){    int tot = 0;    memset(d,63,sizeof(d));    memset(v,0,sizeof(v));    memset(f,0,sizeof(f));    v[0] = 1; d[0] = 0;    for (int i = 1; i < n; i++)    {        d[i] = a[0][i];        f[i] = 0;    }    for (int i = 1; i < n; i++)    {        int k = 0,minn = 1000000000;        for (int j = 0; j < n; j++) if (!v[j] && d[j] < minn)        { minn = d[j]; k = j;        }        tot += d[k];        v[k] = 1;        for (int j = 0; j < n; j++) if (!v[j] && d[j] > a[k][j])        { d[j] = a[k][j]; f[j] = k;        }    }    return tot;}void dfs(int x){    for (int i = 0; i < n; i++)        if (f[i] == x && a[x][i] < 1000000000 && a[x][i] != -1)    {        dfs(i);        for (int j = 0; j < n; j++) b[x][j] = min(b[x][j],b[i][j]);    }    for (int i = 0; i < n; i++)    if (i != f[x]) b[x][i] = min(b[x][i],a[x][i]);}int main(){    while (scanf("%d%d",&n,&m) != EOF)    {        if (n == 0 && m ==0) break;        memset(a,63,sizeof(a));        for (int i = 1; i <= m; i++)        { scanf("%d%d%d",&x,&y,&z); if (x != y) a[x][y] =a[y][x] = z;        }        int ans = prim();        memset(b,63,sizeof(b));        for (int i = 0; i < n; i++) a[i][i] = -1;        f[0] = -1;        dfs(0);        int q;        scanf("%d",&q);        long long sum = 0;        //cout<<ans<<endl;        for (int i = 0; i < q; i++)        { scanf("%d%d%d",&x,&y,&z); if (f[x] == y) {     int minn = 1000000000;     sum = sum + ans;     sum -= a[x][y];     for (int j = 0; j < n; j++)     if (j != y && b[x][j] != -1) minn = min(minn,b[x][j]);     for (int j = 0; j < n; j++)     if (f[j] == x && b[j][y] != -1) minn = min(minn,b[j][y]);     minn = min(minn,z);     sum += minn; } else if (f[y] == x) {     int minn = 1000000000;     sum = sum + ans;     sum -= a[y][x];     for (int j = 0; j < n; j++)     if (j != x && b[y][j] != -1) minn = min(minn,b[y][j]);     for (int j = 0; j < n; j++)     if (f[j] == y && b[j][x] != -1) minn = min(minn,b[j][x]);     minn = min(minn,z);     sum += minn; } else sum += ans;        }        double fin = sum;        fin = fin / q;        printf("%.4fn",fin);    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/364872.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号