标签:
题意:
有n个城市,编号为1~你,m条路,每条路起点为u,终点为v,从u到v的路费是cost,,从1开始走,求在k时刻到达n的最小花费,如果k时刻无法到达n,则输出-1
方法:flody+矩阵快速幂
注意点:数组调用函数后,它本身的值会变(数组的函数调用实际上传递的是位置)
(详细可见 http://blog.chinaunix.net/uid-16875687-id-2155704.html )
1 #include<stdio.h> 2 3 int f(int b[2][2]) 4 { 5 for(int i=0;i<2;i++) 6 { 7 for(int j=0;j<2;j++) 8 b[i][j]++; 9 } 10 } 11 int main() 12 { 13 int a[2][2]; 14 for(int i=0;i<2;i++) 15 { 16 for(int j=0;j<2;j++) 17 scanf("%d",&a[i][j]); 18 } 19 f(a); 20 for(int i=0;i<2;i++) 21 { 22 for(int j=0;j<2;j++) 23 printf("%d ",a[i][j]); 24 } 25 return 0; 26 }
这一题其实可以理解成用k个flody循环(一个城市可以重复走),k数值太大,用矩阵快速幂减少时间
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 #define INF 1000000000000000LL//define默认是int,数值太大时加LL 5 #define N 55 6 __int64 ma[N][N],temp[N][N]; 7 int n; 8 void floy(__int64 a[N][N]) 9 { 10 int i,j,k; 11 for(i=1;i<=n;i++) 12 for(j=1;j<=n;j++) 13 temp[i][j] = INF; 14 for(k=1;k<=n;k++) 15 for(i=1;i<=n;i++) 16 for(j=1;j<=n;j++) 17 temp[i][j] = min(temp[i][j],a[i][k]+ma[k][j]); 18 for(i=1;i<=n;i++) 19 for(j=1;j<=n;j++) 20 a[i][j] = temp[i][j]; 21 } 22 23 void f(int k,__int64 dis[N][N]) 24 { 25 k--; 26 while(k) 27 { 28 if(k&1) floy(dis); //判断奇偶 奇&1=1 偶&1=0 29 floy(ma); 30 k=k/2; 31 } 32 } 33 34 int main() 35 { 36 int t,m,k; 37 int i,j; 38 int u,v; 39 __int64 cost; 40 __int64 dis[N][N]; 41 cin>>t; 42 while(t--) 43 { 44 cin>>n>>m>>k; 45 for(i=1;i<=n;i++) 46 for(j=1;j<=n;j++) 47 { 48 dis[i][j]=INF; 49 ma[i][j]=INF; 50 } 51 52 for(i=1;i<=m;i++) 53 { 54 cin>>u>>v>>cost; 55 if(ma[u][v]>cost) //重边 56 { 57 ma[u][v]=cost; 58 dis[u][v]=ma[u][v]; 59 } 60 } 61 62 f(k,dis); 63 64 if(dis[1][n]>=INF) cout<<"-1"<<endl; 65 else cout<<dis[1][n]<<endl; 66 } 67 return 0; 68 }
标签:
原文地址:http://www.cnblogs.com/yscc/p/4338015.html