首页 > 代码库 > PKU 3613 Cow Relays (指定路径条数的最短路)
PKU 3613 Cow Relays (指定路径条数的最短路)
题意:N,T,S,E:给你T条边,每条边两端都有编号和权值,问从S走到E允许走N条边,求最短路。
foyld加矩阵快速幂思想。
注意要把边离散
#include <iostream> #include <fstream> #include <string.h> #include <algorithm> using namespace std; #define M 303 #define inf 0x3fffffff struct node { int a[M][M]; node() { for(int i=0;i<M;i++) { for(int j=0;j<M;j++) a[i][j]=inf; } } }; int n,t,s,e; int mp[1010],cnt; node ma; void foyld(node &a,node &b,node &c) { node temp; for(int k=1;k<=cnt;k++) { for(int i=1;i<=cnt;i++) { for(int j=1;j<=cnt;j++) temp.a[i][j]=min(a.a[i][k]+b.a[k][j],temp.a[i][j]); } } for(int i=0;i<M;i++) for(int j=0;j<M;j++) c.a[i][j]=temp.a[i][j]; } void pow() { node ans; for(int i=0;i<M;i++) ans.a[i][i]=0; while(n) { if(n&1) foyld(ma,ans,ans); foyld(ma,ma,ma); n>>=1; } printf("%d\n",ans.a[mp[s]][mp[e]]); } int main() { while(~scanf("%d%d%d%d",&n,&t,&s,&e)) { int a,b,c; cnt=0; memset(mp,0,sizeof(mp)); while(t--) { scanf("%d%d%d",&c,&a,&b); if(!mp[a]) mp[a]=++cnt; if(!mp[b]) mp[b]=++cnt; ma.a[mp[a]][mp[b]]=ma.a[mp[b]][mp[a]]=c; } pow(); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。