zoukankan      html  css  js  c++  java
  • 8月12号的(算是)组队赛吧。HDU 3790&&HDU 3665&&HDU 1869&&POJ 1847

    最近感冒了,状态一直不好,但是发现感冒好了之后,就没有心思做题了,淡定!还有仅仅的十几天就Over了!!

    今天偷偷瞟了一眼大神们在做的多校联赛。唉~大神们都被虐啊!顿时更没心情了!!还是好好刷题吧。。。

    这次是最短路的专题:(听说有四种方法:本人只知道两种,还不太会)

    首先肯定做的是模板题!!!!!

    因为有两道是做过的,参见以前的代码:HDU 2544HDU 1874(这里)

    最短路径问题 HDU 3790

    还是很水的一道题:搞好距离和花费的关系就行了。

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<string.h>
     5 using namespace std;
     6 int b[1005][1005],a[1005][1005],c[1005];
     7 int main()
     8 {
     9     int n,m,i,j,min1,max1=100005,a1,a2,b1,b2,c1,c2,p;
    10     while(scanf("%d%d",&n,&m)!=EOF)
    11     {
    12         if(n==0&&m==0)
    13             break;
    14         for(i=1;i<=n;i++)
    15             for(j=1;j<=n;j++)
    16                 {a[i][j]=max1;b[i][j]=max1;}
    17         for(i=1;i<=n;i++)
    18             {a[i][i]=0;b[i][i]=0;}
    19         while(m--)
    20         {
    21             scanf("%d%d%d%d",&a1,&a2,&b1,&b2);
    22             if(a[a1][a2]>b1)
    23             {
    24                 a[a1][a2]=b1;
    25                 a[a2][a1]=b1;
    26                 b[a1][a2]=b2;
    27                 b[a2][a1]=b2;//注意这里距离和花费的关系!
    28             }
    29             if(a[a1][a2]==b1&&b[a1][a2]>b2)//首先肯定在距离最短的情况下才考虑花费最少!
    30             {
    31                 b[a1][a2]=b2;
    32                 b[a2][a1]=b2;
    33             }
    34         }
    35         scanf("%d%d",&c1,&c2);
    36         memset(c,0,sizeof(c));
    37         for(i=1;i<=n;i++)
    38         {
    39             min1=100005;
    40             for(j=1;j<=n;j++)
    41             {
    42                 if(a[c1][j]<min1&&!c[j])
    43                 {
    44                     min1=a[c1][j];
    45                     p=j;
    46                 }
    47             }
    48             c[p]=1;
    49             if(min1==100005)
    50                 break;
    51             for(j=1;j<=n;j++)
    52             {
    53                 if(!c[j]&&a[c1][j]>a[c1][p]+a[p][j])
    54                     {
    55                         a[c1][j]=a[c1][p]+a[p][j];
    56                         a[j][c1]=a[c1][j];
    57                         b[c1][j]=b[c1][p]+b[p][j];
    58                         b[j][c1]=b[c1][j];
    59                     }
    60                 if(!c[j]&&a[c1][j]==a[c1][p]+a[p][j])//这里是距离相等时求最少花费的
    61                 {
    62                     b[c1][j]=min(b[c1][j],b[c1][p]+b[p][j]);
    63                     b[j][c1]=b[c1][j];
    64                 }
    65             }
    66         }
    67         printf("%d %d
    ",a[c1][c2],b[c1][c2]);
    68 
    69     }
    70     return 0;
    71 }

    Seaside HDU 3665

    很水的吧。就是题目难看懂!

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<string.h>
     5 using namespace std;
     6 int max1,max2,min1,p,i,j,a1,a2,b1,b2,n;
     7 int a[15][15],b[15],c[15];//这个题目竟然只有开这么大的数组!(其实你不知道做,暴力枚举也费时间的!)b[]判断是否沿海
     8 int main()
     9 {
    10     max1=100005;
    11     while(scanf("%d",&n)!=EOF)
    12     {
    13         for(i=0;i<n;i++)
    14             for(j=0;j<n;j++)
    15                 a[i][j]=max1;
    16         for(i=0;i<n;i++)
    17             a[i][i]=0;
    18         for(i=0;i<n;i++)
    19         {
    20             scanf("%d%d",&a1,&a2);
    21             b[i]=a2;
    22             while(a1--)
    23             {
    24                 scanf("%d%d",&b1,&b2);
    25                 if(a[i][b1]>b2)
    26                 {
    27                     a[i][b1]=b2;
    28                     a[b1][i]=a[i][b1];
    29                 }
    30             }
    31         }
    32         memset(c,0,sizeof(c));
    33         for(i=0;i<n;i++)
    34         {
    35             min1=1000005;
    36             for(j=0;j<n;j++)
    37             {
    38                 if(!c[j]&&min1>a[0][j])
    39                 {
    40                     min1=a[0][j];
    41                     p=j;
    42                 }
    43             }
    44             c[p]=1;
    45             for(j=0;j<n;j++)
    46             {
    47                 if(!c[j]&&a[0][j]>a[0][p]+a[p][j])
    48                 {
    49                     a[0][j]=a[0][p]+a[p][j];
    50                     a[j][0]=a[0][j];
    51                 }
    52             }
    53         }//这个迪杰斯特拉算法是单源最短路的!(貌似要知道起点才行的)
    54         max2=10000005;
    55         for(i=1;i<n;i++)
    56         {
    57             if(b[i]==1&&a[0][i]<max2)
    58                 max2=a[0][i];
    59         }
    60         printf("%d
    ",max2);
    61     }
    62     return 0;
    63 }

    六度分离 HDU 1869

    这个题目我一开始就想偏了!(我把所有路归零,来求最长路去了!)//再看题目才发现不能求最长路来做

    竟然没发现此算法只能求最短路的!!(Shit)

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<string.h>
     5 #include<math.h>
     6 using namespace std;
     7 int a[105][105];
     8 int main()
     9 {
    10     int n,m,i,j,k,max1,a1,a2,b,max2;
    11     max1=1005;
    12     while(scanf("%d%d",&n,&m)!=EOF)
    13     {
    14         for(i=0;i<n;i++)
    15             for(j=0;j<n;j++)
    16                 a[i][j]=max1;
    17         for(i=0;i<n;i++)
    18             a[i][i]=0;
    19         while(m--)
    20         {
    21             scanf("%d%d",&a1,&a2);
    22             a[a1][a2]=1;
    23             a[a2][a1]=1;
    24         }
    25 
    26         for(k=0;k<n;k++)
    27         for(i=0;i<n;i++)
    28         for(j=i+1;j<n;j++)
    29         {
    30             if(a[i][j]>a[i][k]+a[k][j])
    31             {
    32                 a[i][j]=a[i][k]+a[k][j];
    33                 a[j][i]=a[i][j];
    34             }
    35         }
    36         max2=0;
    37         for(i=0;i<n;i++)
    38             for(j=0;j<n;j++)
    39         {
    40             if(a[i][j]>max2)
    41             max2=a[i][j];
    42         }//要放在外面进行比较!
    43         if(max2-1<=6)
    44             printf("Yes
    ");
    45         else
    46             printf("No
    ");
    47 
    48     }
    49     return 0;
    50 }

    貌似水题都出来了。。。但是后面竟还有一个模板题!!!!

    Tram POJ 1847

    只是题意较难懂!但是我恰恰对英文不敏感(头痛的地步!)

    题意:直接看样例:

    第一排给出:路口数(1~N) 起点  终点

    接下来每条路口有几个岔口   之后的第一个岔口不用搬开关(为0) 之后的就是(为1)

    以下如此:(以文件作为结束)

    输出:

    起点到终点最少的搬开关数目(就是在0与1之间选)

    解法:用迪杰斯特拉算法求解:模板就行了。(这个题目是单向的。就是a[1][3]与a[3][1]值不一样)

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<algorithm>
     4 #include<string.h>
     5 using namespace std;
     6 int a[105][105],c[105];
     7 int main()
     8 {
     9     int n,a1,b1,i,j,max1,min1,m,a2,p;
    10     max1=100005;
    11     while(scanf("%d%d%d",&n,&a1,&b1)!=EOF)
    12     {
    13         for(i=1;i<=n;i++)
    14             for(j=1;j<=n;j++)
    15                 a[i][j]=max1;
    16         for(i=1;i<=n;i++)
    17             a[i][i]=0;
    18         for(i=1;i<=n;i++)
    19         {
    20             scanf("%d",&m);
    21             for(j=1;j<=m;j++)
    22             {
    23                 scanf("%d",&a2);
    24                 if(j==1)
    25                     a[i][a2]=0;
    26                 else
    27                     a[i][a2]=1;
    28             }
    29         }
    30         memset(c,0,sizeof(c));
    31         for(i=1;i<=n;i++)
    32         {
    33             min1=10005;
    34             for(j=1;j<=n;j++)
    35             {
    36                 if(a[a1][j]<min1&&!c[j])
    37                 {
    38                     min1=a[a1][j];
    39                     p=j;
    40                 }
    41             }
    42             c[p]=1;
    43             for(j=1;j<=n;j++)
    44             if(!c[j]&&a[a1][j]>a[a1][p]+a[p][j])
    45                 a[a1][j]=a[a1][p]+a[p][j];
    46         }
    47         if(a[a1][b1]!=max1)
    48             printf("%d
    ",a[a1][b1]);
    49         else
    50             printf("-1
    ");
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    【JZOJ5093】【GDSOI2017第四轮模拟day3】字符串匹配 哈希
    【JZOJ5094】【GDSOI2017第四轮模拟day3】鸽子 计算几何+floyd
    2017.4省选集训最终总结
    基于Idea从零搭建一个最简单的vue项目
    npm的镜像替换成淘宝
    maven settings.xml--需要保存到用户/.m2文件夹下
    @Controller @RestController
    SQL SERVER 查询所有数据表名称和数据行数
    linux 常用命令集锦
    java 数字左补齐0
  • 原文地址:https://www.cnblogs.com/tt123/p/3255494.html
Copyright © 2011-2022 走看看