• 最短路


    网站:CSUST 8月12日(最短路)

    A,C,D,E都是Floyd算法........代码就不发了。

    B   最短路径问题   HDU 3790

    代码:    328MS

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 const int MAX = 1000+5,inf = 1061109568;
     6 int map[MAX][MAX][2],visit[MAX],T[MAX],cost[MAX],n,m;
     7 int main() 
     8 {
     9     int a,b,d,p,s,e;
    10     while(scanf("%d%d",&n,&m),n+m)
    11      {
    12         memset(map,0x3f,sizeof(map));
    13         memset(cost,0x3f,sizeof(cost));
    14         memset(T,0x3f,sizeof(T)); 
    15         for(int i = 1;i<=m;++i)
    16          {
    17             scanf("%d%d%d%d",&a,&b,&d,&p);
    18             if(d<map[a][b][0]) 
    19             {      //对于输入的处理很重要 
    20                 map[a][b][0] = map[b][a][0] = d;
    21                 map[a][b][1] = map[b][a][1] = p;
    22             }
    23             else if(d==map[a][b][0])
    24             map[a][b][1] = map[b][a][1]=min(map[a][b][1],p);
    25         }
    26         scanf("%d%d",&s,&e);
    27         T[s] = cost[s] = 0;   //将起点的花费和路径长度都赋0 
    28         T[0] = inf-1;       //为便于更新s的值,将T[0]赋无穷大 
    29         memset(visit,0,sizeof(visit));
    30         while(1)
    31          {
    32             for(int i = 1;i<=n;++i)
    33             if(!visit[i]&&(T[s]+map[s][i][0])<=T[i]) 
    34             {
    35                 if(T[s]+map[s][i][0]<T[i]) 
    36                 { //这一步的处理很重要,要将等于和小于的情况分开处理 
    37                     T[i] = T[s] + map[s][i][0];
    38                     cost[i] = cost[s] + map[s][i][1];
    39                 }
    40                 else if(T[s]+map[s][i][0]==T[i])
    41                 cost[i] = min(cost[i],cost[s] + map[s][i][1]);
    42             }
    43             visit[s] = 1;
    44             s = 0; //将s做初始化处理 
    45             bool flag = 1;
    46             for(int i = 1;i<=n;++i)
    47             if(!visit[i]&&T[i]<T[s]) 
    48             {
    49                 flag = 0;
    50                 s = i;
    51             }
    52             if(flag) //设置退出条件 
    53             break;
    54         }
    55         printf("%d %d
    ",T[e],cost[e]);
    56     }
    57     return 0;
    58 }

     H   凶残的看不懂题的题......还是Floyd    Tram     POJ 1847     16ms

     1 #include<cstdio> 
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<iostream>
     5 using namespace std;
     6 const int maxn = 110;
     7 const int INF = 10000000;
     8 int dist[maxn][maxn];
     9 int n,start, end;
    10 int main()
    11 {
    12     while(~scanf("%d%d%d",&n,&start,&end))
    13     {
    14         for(int i=1;i<=n;i++)
    15         {
    16             for(int j=1;j<=n;j++)
    17                 if(i==j)
    18                     dist[i][j]=0;
    19                 else
    20                     dist[i][j] = INF;
    21         }
    22         int path,y;
    23         for(int i=1;i<=n;i++)
    24         {
    25             scanf("%d",&path);
    26             for(int j=1;j<=path;j++)
    27             {
    28                 scanf("%d",&y);
    29                 if(j==1)
    30                     dist[i][y]=0;
    31                 else
    32                     dist[i][y]=1;
    33             }
    34         }
    35         for(int i=1;i<=n;i++)
    36             for(int j=1;j<=n;j++)
    37                 for(int k=1;k<=n;k++)
    38                     dist[j][k] =min(dist[j][k],dist[j][i] + dist[i][k] );
    39     }
    40     if(dist[start][end]==INF)
    41         printf("-1
    ");
    42     else
    43         printf("%d
    ",dist[start][end]);
    44     return 0;
    45 }

     I     昂贵的聘礼    POJ 1062

    代码:      0ms

     1 #include <stdio.h>
     2 #include <string.h>
     3 const int INF = 0x3f3f3f3f;
     4 int map[110][110];
     5 int rank[110],dis[110],vis[110];
     6 int n,m;
     7 int Dijkstra(int k)
     8 {
     9     int i,j;
    10     memset(vis,0,sizeof(vis));
    11     vis[0] = 1;
    12     for(i = 0; i <= n; i++)
    13         dis[i] = map[0][i];
    14     dis[0] = 0;
    15     for(i = 1; i <= n; i++)
    16     {
    17         int min = INF,pos;
    18         for(j = 0; j <= n; j++)
    19             if(dis[j] < min && !vis[j])
    20                 min = dis[pos=j];
    21         vis[pos] = 1;
    22         for(j = 0; j <= n; j++)
    23             if(!vis[j] && dis[j] > dis[pos] + map[pos][j] && rank[pos] >= k && rank[pos] <= k+m)
    24                 dis[j] = dis[pos] + map[pos][j];
    25     }
    26     return dis[1];
    27 }
    28 int main()
    29 {
    30     int i;
    31     int p,x,t,v;
    32     memset(map, 0x3f, sizeof(map));
    33     scanf("%d %d",&m,&n);
    34     for(i = 1; i <= n; i++)
    35     {
    36         scanf("%d %d %d",&p,&rank[i],&x);
    37         map[0][i] = p;
    38         while(x--)
    39         {
    40             scanf("%d %d",&t,&v);
    41             map[t][i] = v;     //能替代i的物品,编号为t,价值为v
    42         }
    43     }
    44     int min = INF,ans;
    45     for(i = rank[1]-m; i <= rank[1]; i++) //枚举从rank[1]-m到rank[1]的等级;取这些最短路中最短的;
    46     {
    47         ans = Dijkstra(i);
    48         if(min > ans)
    49             min = ans;
    50     }
    51     printf("%d
    ",min);
    52     return 0;
    53 }
  • 相关阅读:
    redis conf 中文详解
    sed 用法记录
    MySQL数据库的各种存储引擎详解
    MySQL数据库char与varchar的区别分析及使用建议
    从一个乘法来分析C语言
    排它平方数
    高斯日记
    SUID或SGID程序中能不能用system函数
    【转载】GDB反向调试(Reverse Debugging)
    setuid函数解析
  • 原文地址:https://www.cnblogs.com/riddle/p/3255853.html
Copyright © 2020-2023  润新知