zoukankan      html  css  js  c++  java
  • hdu 1599 find the mincost route(dijkstra||floyed)

    hdu 1599 find the mincost route

    http://acm.hdu.edu.cn/showproblem.php?pid=1599

    Problem Description
    杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK,V1,那么必须满足K>2,就是说至除了出发点以外至少要经过2个其他不同的景区,而且不能重复经过同一个景区。现在8600需要你帮他找一条这样的路线,并且花费越少越好。
     

    Input
    第一行是2个整数N和M(N <= 100, M <= 1000),代表景区的个数和道路的条数。
    接下来的M行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,并且需要花费c元(c <= 100)。
     

    Output
    对于每个测试实例,如果能找到这样一条路线的话,输出花费的最小值。如果找不到的话,输出"It's impossible.".
     

    Sample Input
    3 3 1 2 1 2 3 1 1 3 1 3 3 1 2 1 1 2 3 2 3 1
     

    Sample Output
    3 It's impossible.

    //dijkstra算法AC代码
    #include<iostream>
    #define INF 999999
    #define MAXN 110
    using namespace std;
    int map[MAXN][MAXN],dis[MAXN],v[MAXN];
    void dijkstra(int s,int n)
    {
     int i,k,MIN,j;
     for(i=1;i<=n;i++)
      dis[i]=map[s][i];
     memset(v,0,sizeof(v));
     v[s]=1;
     dis[s]=0;
     for(i=2;i<=n;i++)
     {
      k=s;
      MIN=INF;
      for(j=1;j<=n;j++)
       if(!v[j]&&MIN>dis[j])
       {
        k=j;
        MIN=dis[j];
       }
      v[k]=1;
      for(j=1;j<=n;j++)
       if(!v[j]&&map[k][j]<INF)
       {
        if(dis[j]>map[k][j]+dis[k])
         dis[j]=map[k][j]+dis[k];
       }
     }
    }
    int main()
    {
     int n,m,a,b,c;
     while(~scanf("%d%d",&n,&m))
     {
      int i,j;
      for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
        map[i][j]=INF;
      for(i=1;i<=m;i++)
      {
       scanf("%d%d%d",&a,&b,&c);
       if(map[a][b]>c)
        map[a][b]=map[b][a]=c;
      }
      int MIN=INF,temp,res;
      for(i=1;i<=n;i++)
      {
       for(j=1;j<=n;j++)
       {
        if(map[i][j]!=INF)
        {
         temp=map[i][j];
         map[i][j]=map[j][i]=INF;
         dijkstra(i,n);
         if(MIN>dis[j]+temp)
          MIN=dis[j]+temp;
         map[i][j]=map[j][i]=temp;
        }
       }
      }
      if(MIN==INF)
       puts("It's impossible.");
      else
       printf("%d\n",MIN);
     }
     return 0;
    }

    //floyd算法
    #include<iostream>
    #define INF 999999
    #define MAXN 110
    using namespace std;
    int map[MAXN][MAXN],MIN,dis[MAXN][MAXN];
    void floyd(int n)
    {
     int i,j,k;
     for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
       dis[i][j]=map[i][j];
     for(k=1;k<=n;k++)
     {
      for(i=1;i<=k;i++)
       for(j=1;j<i;j++)
        if(MIN>dis[i][j]+map[i][k]+map[k][j])
         MIN=dis[i][j]+map[i][k]+map[k][j];
      for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
        if(dis[i][j]>dis[i][k]+dis[k][j])
         dis[i][j]=dis[i][k]+dis[k][j];
     }
    }
    int main()
    {
     int n,m,a,b,c;
     while(~scanf("%d%d",&n,&m))
     {
      int i,j;
      for(i=1;i<=n;i++)
       for(j=1;j<=n;j++)
        map[i][j]=INF;
      for(i=1;i<=m;i++)
      {
       scanf("%d%d%d",&a,&b,&c);
       if(map[a][b]>c)
        map[a][b]=map[b][a]=c;
      }
      MIN=INF;
      floyd(n);
      if(MIN==INF)
       puts("It's impossible.");
      else
       printf("%d\n",MIN);
     }
     return 0;
    }

  • 相关阅读:
    素数判定方法,方法持续更新...
    C++暂停黑窗口
    【python爬虫】scrapy入门6-生成多个spider
    【python爬虫】scrapy入门5--xpath等后面接正则
    python基础:list与string互转
    【python爬虫】scrapy实战1--百万微博任性采集
    【python爬虫】scrapy入门4--添加cookies
    【python爬虫】scrapy入门2--自定义item
    【python爬虫】scrapy入门1--环境搭建
    sklearn学习:为什么roc_auc_score()和auc()有不同的结果?
  • 原文地址:https://www.cnblogs.com/crazyapple/p/2999413.html
Copyright © 2011-2022 走看看