poj 3613

http://poj.org/problem?id=3613
题目大意: 给出一张无向连通图,求S到E经过k条边的最短路。
把矩阵乘法换成Floyd,注意各种初始化以及点的数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<stdio.h>
#include<cstring>
#include<map>
#include<algorithm>
#include<iostream>
#define mem(x,y) memset(x,y,sizeof(x))
#define inf 0x3f3f3f3f
using namespace std;
#define siz 102
#define Mytype long long
int N;
Mytype mod = 1000;
struct matrix
{
Mytype a[siz][siz];
matrix operator*(const matrix &y)const
{
matrix res;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
res.a[i][j]=inf;
for(int k=0;k<N;k++)
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
res.a[i][j]=min(res.a[i][j],a[i][k]+y.a[k][j]);
return res;
}
};
matrix qmod(matrix a,int k)
{

matrix res=a;
k--;
while(k)
{
if(k&1)
res=res*a;
a=a*a;
k>>=1;
}
return res;
}
void print(matrix k)
{

for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
printf("%d ",k.a[i][j]);
puts("");
}
}
map<int,int> mp;
int main()
{

int n,t,s,e;
scanf("%d%d%d%d",&n,&t,&s,&e);
matrix a;
N=t+1;
for(int j=0;j<N;j++)
for(int i=0;i<N;i++)
a.a[i][j]=inf;
int ecnt=1;
while(t--)
{
int l,u,v;
scanf("%d%d%d",&l,&u,&v);
if(!mp[u])mp[u]=ecnt++;
if(!mp[v])mp[v]=ecnt++;
u=mp[u]-1,v=mp[v]-1;
a.a[u][v]=a.a[v][u]=l;
}
N=ecnt-1;
a=qmod(a,n);
s=mp[s]-1,e=mp[e]-1;
printf("%d\n",a.a[s][e]);
}

EOF