POJ1734 Sightseeing Trip

来源:互联网 发布:怎么做好淘宝网店 编辑:程序博客网 时间:2024/06/04 23:18
  • 题目大意:给定N个点和M条边的无向图,求出其中存在的最小环。

  • 数据范围:N<=100,M<=10000。

  • 思路:
    -有向图求最小环,令dist[i,i]=+∞,然后floyd求最短路即可。
    -无向图求最小环,先进行floyd,在最外层循环开始进行k时,用map[i][k]+map[k][j]+dist[i][j]来更新最小环。

  • 注意:
    -题目中存在重边,需要取最小值。
    -需要在floyd之前更新最小环,这样才能保证这样保证了从i到j这条路不经过k。

  • 在程序中:
    -map[ ]记录原始距离,dist[ ]记录最短路,path[ ]记录最短路上的点,num记录最短路上点的个数。
    -pre[ ][ ]记录两点之间的中转点,初始化为后面的下标。record( )给path[ ]赋值,当pre[ ][ ]的值等于后面的下标时,说明已经到了端点,退出,再弥补未记录的点。

  • 程序如下:

#include<iostream>#include<cstring>using namespace std;const int maxn=110;const int bignum=10000000;int map[maxn][maxn],n,m,num;int pre[maxn][maxn],dist[maxn][maxn],path[maxn];void init(){    cin>>n>>m;    memset(pre,-1,sizeof(pre));    for (int i=1;i<=n;++i)    {        for (int j=1;j<=n;++j)        {            map[i][j]=dist[i][j]=map[j][i]=dist[j][i]=bignum;        }    }    int u,v,len;    for (int i=1;i<=m;++i)    {        cin>>u>>v>>len;        if (map[u][v]>len)        {            map[u][v]=map[v][u]=dist[u][v]=dist[v][u]=len;            pre[u][v]=v;            pre[v][u]=u;        }    }   }void record(int i,int j){    int k=pre[i][j];    if(k==j)    {         path[++num]=j;         return ;    }    record(i,k);    record(k,j);}void floyd(){    int i,j,k;    int ans=bignum;    for (k=1;k<=n;++k)    {               for (i=1;i<k;++i)           for (j=i+1;j<k;++j)          {              if (map[i][k]+map[k][j]+dist[i][j]<ans)              {                  ans=map[i][k]+map[k][j]+dist[i][j];                  num=0;                              path[++num]=i;                  record(i,j);                  path[++num]=k;                       }          }         for (i=1;i<=n;++i)          for (j=1;j<=n;++j)          {              if (dist[i][k]+dist[k][j]<dist[i][j])              {                  dist[i][j]=dist[i][k]+dist[k][j];                  pre[i][j]=k;              }          }              }       if (ans==bignum)    {        cout<<"No solution.";    }    else    {        for (i=1;i<=num-1;++i)          cout<<path[i]<<" ";        cout<<path[num];    }   }int main(){    init();    floyd();    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 gec安全密码忘了怎么办 唯品会微信商城地址错怎么办跨省 电脑突然没网了怎么办 移动光猫只能连一台电脑怎么办 网上银行用户名和密码忘了怎么办 中国银行网银用户名忘了怎么办 中行企业网银证书过期怎么办 腾讯会员被别人登录了怎么办 微信限90天提现转帐功能怎么办? 星巴克券过期了怎么办 京东买面膜发个空包怎么办 手机低于4.4版本怎么办才能恢复 263云通信密码忘了怎么办 有信电话拉黑了怎么办 微信手机充值冲错了怎么办 国通石油卡怎么办红卡 善融商城有假货怎么办 中百购物卡丢了怎么办 cncbk被骗25万该怎么办 中银e贷额度冻结怎么办 招行抵押贷循环额度怎么办 小额钱袋被拒了怎么办 银行需要提供消费贷款发票怎么办 中银e贷款逾期怎么办 按揭房不想要了怎么办 房贷不想还了怎么办 融e借没有u盾怎么办 窗式空调声音大怎么办 瑞得卡过期了怎么办 对公账号转错了怎么办 中银e令丢了怎么办 中银e贷到期了怎么办 招行信用卡附属卡怎么办 华普超市购物卡怎么办 公司发超市购物卡怎么办 物美购物卡丢了怎么办 淘宝买肯德基电子券留错号码怎么办 京东e卡过期了怎么办 京东e卡绑定错了怎么办 手机换号京东账号绑的银行卡怎么办 京东金条激活失败怎么办