码迷,mamicode.com
首页 > 其他好文 > 详细

FZU 2173 Nostop

时间:2015-03-14 19:59:47      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

题意:

  有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 }
View Code

 

FZU 2173 Nostop

标签:

原文地址:http://www.cnblogs.com/yscc/p/4338015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!