最近感冒了,状态一直不好,但是发现感冒好了之后,就没有心思做题了,淡定!还有仅仅的十几天就Over了!!
今天偷偷瞟了一眼大神们在做的多校联赛。唉~大神们都被虐啊!顿时更没心情了!!还是好好刷题吧。。。
这次是最短路的专题:(听说有四种方法:本人只知道两种,还不太会)
首先肯定做的是模板题!!!!!
因为有两道是做过的,参见以前的代码:HDU 2544和HDU 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 }