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;
} 

 

posted @ 2019-11-08 15:02  水题收割者  阅读(162)  评论(0编辑  收藏  举报