题解

用一个矩阵来表示一个图的边的存在性,即矩阵C【i,j】=1表示有一条从i到j的有向边C【i,j】=0表示没有从i到j的边。这个矩阵的k次方后C【i,j】就表示有多少条从i到j恰好经过k条边的路径。

在此题中我们赋予边权值并把矩阵乘法中的+改为min这样这个矩阵的k次方后C【i,j】就表示从i到j恰好经过k条边的最短路径。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=;
int n,t,s,e,u[N],v[N],w[N],b[N],a[N],ma[],num,tot;
struct jz{
int a[N][N];
}x;
jz jzc(jz a,jz b){
jz c;
for(int i=;i<=num;i++)
for(int j=;j<=num;j++){
c.a[i][j]=;
}
for(int i=;i<=num;i++)
for(int j=;j<=num;j++)
for(int k=;k<=num;k++){
c.a[i][j]=min(c.a[i][j],a.a[i][k]+b.a[k][j]);
}
return c;
}
jz ksm(jz a,int k){
jz ans=a;
k--;
while(k){
if(k&){
ans=jzc(ans,a);
}
k>>=;
a=jzc(a,a);
}
return ans;
}
int main(){
scanf("%d%d%d%d",&n,&t,&s,&e);
for(int i=;i<=t;i++){
scanf("%d%d%d",&w[i],&u[i],&v[i]);
a[++tot]=u[i];
b[tot]=u[i];
a[++tot]=v[i];
b[tot]=v[i];
}
sort(b+,b++tot);
num=unique(b+,b++tot)-(b+);
for(int i=;i<=tot;i++){
ma[a[i]]=lower_bound(b+,b++num,a[i])-b;
}
for(int i=;i<=num;i++)
for(int j=;j<=num;j++)
x.a[i][j]=;
for(int i=;i<=t;i++){
x.a[ma[u[i]]][ma[v[i]]]=min(x.a[ma[u[i]]][ma[v[i]]],w[i]);
x.a[ma[v[i]]][ma[u[i]]]=min(x.a[ma[v[i]]][ma[u[i]]],w[i]);
}
x=ksm(x,n);
printf("%d",x.a[ma[s]][ma[e]]);
return ;
}
/*
2 6 6 4
11 4 6
4 4 8
8 4 9
6 6 8
2 6 9
3 8 9
*/

poj 3613 Cow Relays(矩阵的图论意义)的更多相关文章

  1. Poj 3613 Cow Relays (图论)

    Poj 3613 Cow Relays (图论) 题目大意 给出一个无向图,T条边,给出N,S,E,求S到E经过N条边的最短路径长度 理论上讲就是给了有n条边限制的最短路 solution 最一开始想 ...

  2. poj 3613 Cow Relays

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5411   Accepted: 2153 Descri ...

  3. 【floyd+矩阵乘法】POJ 3613 Cow Relays

    Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a rel ...

  4. POJ 3613 Cow Relays (floyd + 矩阵高速幂)

    题目大意: 求刚好经过K条路的最短路 我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B  B[i][j]  就表示   i-j 刚好走过两条路的方法数 那么同理 我们把 ...

  5. poj 3613 Cow Relays【矩阵快速幂+Floyd】

    !:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所 ...

  6. POJ 3613 [ Cow Relays ] DP,矩阵乘法

    解题思路 首先考虑最暴力的做法.对于每一步,我们都可以枚举每一条边,然后更新每两点之间经过\(k\)条边的最短路径.但是这样复杂度无法接受,我们考虑优化. 由于点数较少(其实最多只有\(200\)个点 ...

  7. POJ 3613 Cow Relays【k边最短路】

    题目链接:http://poj.org/problem?id=3613 题目大意: 给出n头牛,t条有向边,起点以及终点,限制每头牛放在一个点上,(一个点上可以放多头牛),从起点开始进行接力跑到终点, ...

  8. POJ 3613 Cow Relays(floyd+快速幂)

    http://poj.org/problem?id=3613 题意: 求经过k条路径的最短路径. 思路: 如果看过<矩阵乘法在信息学的应用>这篇论文就会知道 现在我们在邻接矩阵中保存距离, ...

  9. POJ 3613 Cow Relays 恰好n步的最短路径

    http://poj.org/problem?id=3613 题目大意: 有T条路.从s到e走n步,求最短路径. 思路: 看了别人的... 先看一下Floyd的核心思想: edge[i][j]=min ...

随机推荐

  1. Creating a Custom Page Layout in SharePoint 2013

    Creating a Custom Page Layout in SharePoint 2013 In my last article, I documented how to create a Ma ...

  2. 重温前端基础之-js排序算法

    javascript数组常用的方法: push():返回值,数组新的长度 pop():返回值,被删除的数组末尾元素 shift():返回值,被删除的数组首部元素 unshift():返回值,数组新的长 ...

  3. Android TextView加下划线的几种方式

    如果是在资源文件里: <resources> <</u></string> <string name="app_name">M ...

  4. 逮住一个bug

    首先我们要找找自己有没有玩过论坛,如果玩过的话是不是一个discuz! x的论坛. 然后执行如下代码: location.href=((d=(await(await fetch("./hom ...

  5. js正则学习小计

    //元字符 {} () ^ $ . ? + //预定义字符 \d \D \w \W \s \S //量词 {n,m} {n} {n,} + ? * //贪婪和惰性 //反向引用 //分组 //候选 / ...

  6. 查看锁表进程SQL语句

    查看锁表进程SQL语句   set pagesize 999 set line180 col ORACLE_USERNAME for a18 col OS_USER_NAME for a18 col ...

  7. cx-oracle-------------------安装

    这个东西弄完就报错.... 这个是Oracle官方的方法:https://oracle.github.io/odpi/doc/installation.html#windows 然而,你懂的,不能用啊 ...

  8. React 第三天

    第三天 01:在组件中使用style行内对象并封装样式对象: CmtItem.jsx: import React from 'react' //第一层封装 将样式对象和UI结构分离 // const ...

  9. tinymce原装插件源码分析(五)-searchreplace

    searchreplace 功能:查找和替换 代码注释见: https://www.xunhanliu.top/static/js/tinymce/plugins/searchreplace/plug ...

  10. js获取当前根目录的方法

    function getRootPath_web() { //获取当前网址,如: http://localhost:8083/uimcardprj/share/meun.jsp var curWwwP ...