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

poj 3164 Command Network

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

poj 3164 Command Network

#include <iostream>#include <cstring>#include <cmath>#include <iomanip>#include <cstdio>using namespace std;#define INF 999999999#define MIN(x, y) ((x) < (y) ? (x) : (y))int villageX[101], villageY[101];double dis[101][101];bool exist[101];bool vis[101];//for DFS, judge if visitedint pre[101];int nv, ne;//number of vertexs and edgesvoid init();void solve();double zhuliu();double dist(int a, int b);void dfs(int t);int main(void){    while (1)    {        init();        if (!(cin >> nv >> ne)) break;        for (int i = 1; i <= nv; i++) cin >> villageX[i] >> villageY[i];        for (int i = 1; i <= ne; i++)        { int a, b; cin >> a >> b; if (a != b && b != 1)//ensure no self-loop     dis[a][b] = dist(a, b);        }        solve();    }    return 0;}void init(){    for (int i = 1; i <= 100; i++)        for (int j = 1; j <= 100; j++) dis[i][j] = INF;    for (int i = 1; i <= 100; i++)        exist[i] = true;    memset(villageX, 0, sizeof(villageX));    memset(villageY, 0, sizeof(villageY));    memset(vis, 0, sizeof(vis));}void solve(){    double t = zhuliu();    if (t < 0.0)        cout << "poor snoopy" << endl;    else        cout << setprecision(2) << setiosflags(ios::fixed) << t << endl;}double zhuliu(){    double res = 0.0;    //judge possiblity    dfs(1);    for (int i = 1; i <= nv; i++)        if (!vis[i]) return -1.0;    while (1)    {        //search for minimum previous edge        for (int i = 2; i <= nv; i++)        { if (!exist[i]) continue; double min = INF; for (int j = 1; j <= nv; j++)     if (exist[j] && dis[j][i] < min)     {         min = dis[j][i];         pre[i] = j;     }        }        //search for loop        int loopEntry = 0;        for (int i = 2; i <= nv; i++)        { int j = i; int count = 0; if (!exist[i]) continue; while (count <= nv) {     count++;     j = pre[j];     if (j == i)    {loopEntry = i; break;}     if (j == 1) break; } if (loopEntry) break;        }        if (!loopEntry)//no loop any more        { for (int i = 2; i <= nv; i++)     if (exist[i])         res += dis[pre[i]][i]; return res;        }        //delete loop        memset(vis, 0, sizeof(vis));        int k = loopEntry;        do        { res += dis[pre[k]][k]; exist[k] = false; vis[k] = true; k = pre[k];        }while (k != loopEntry);        exist[loopEntry] = true;        for (int i = 1; i <= nv; i++)  if (vis[i])//in the loop     for (int j = 1; j <= nv; j++)      if (!vis[j])//out of the loop      {          if (dis[i][j] != INF)   dis[loopEntry][j] = MIN(dis[loopEntry][j], dis[i][j]);          if (dis[j][i] != INF)  dis[j][loopEntry] = MIN(dis[j][loopEntry], dis[j][i] - dis[pre[i]][i]);      }    }}double dist(int a, int b)//distance{    double dx = villageX[a] - villageX[b];    double dy = villageY[a] - villageY[b];    return sqrt(dx*dx + dy*dy);}void dfs(int t){    vis[t] = true;    for (int i = 1; i <= nv; i++)        if (dis[t][i] < INF && !vis[i]) dfs(i);}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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