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\n",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\n",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\n");
45         else
46             printf("No\n");
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\n",a[a1][b1]);
49         else
50             printf("-1\n");
51     }
52     return 0;
53 }
posted on 2013-08-13 17:11  ~~碾压机  阅读(192)  评论(0编辑  收藏  举报