576D Flights for Regular Customers
分析
https://www.cnblogs.com/onioncyc/p/8037056.html
写的好像有点问题
但是大致就是这个意思
代码很好理解
代码
#include<bits/stdc++.h>
using namespace std;
#define bt bitset<160>
const int inf = 0x3f3f3f3f;
int n,m,g[160][160];
bt ans[160],a[160],c[160];
struct node {
int x,y,z;
};
node d[160];
inline bool cmp(const node x,const node y){return x.z<y.z;}
inline void mul(bt a[160],bt b[160]){
int i,j,k;
for(i=1;i<=n;i++)c[i].reset();
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
if(a[i][k])c[i]|=b[k];
for(i=1;i<=n;i++)a[i]=c[i];
}
int main(){
int i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)scanf("%d%d%d",&d[i].x,&d[i].y,&d[i].z);
sort(d+1,d+m+1,cmp);
for(i=1;i<=n;i++)ans[i].reset();
for(i=1;i<=n;i++)ans[i][i]=1;
int Ans=inf;
for(int _=1;_<=m;_++){
for(i=1;i<=n;i++)a[i].reset();
for(i=1;i<_;i++)a[d[i].x][d[i].y]=1;
k=d[_].z-d[_-1].z;
while(k){
if(k&1)mul(ans,a);
mul(a,a);
k>>=1;
}
memset(g,0x3f,sizeof(g));
for(i=1;i<=n;i++)g[i][i]=0;
for(i=1;i<=_;i++)g[d[i].x][d[i].y]=1;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
for(i=1;i<=n;i++)if(ans[1][i])Ans=min(Ans,d[_].z+g[i][n]);
}
if(Ans==inf)puts("Impossible");else printf("%d\n",Ans);
return 0;
}