65pts,写法与众多写法不同,求给出指导
  • 板块P3821 Isaac
  • 楼主Authentic_k
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/9/18 06:25
  • 上次更新2023/11/4 06:30:32
查看原帖
65pts,写法与众多写法不同,求给出指导
250036
Authentic_k楼主2021/9/18 06:25

rt

我的矩阵表示从0时刻可以转移到下个时刻的矩阵。所以从0开始乘

#include<bits/stdc++.h>
#define INF 2147483647
#define MAXN 1000000
using namespace std;
int n,m,s,t,k;
struct node
{
	   int u,v,w;
}lu[MAXN];
vector<int> tim[MAXN];
struct matix
{
	   int jz[55][55];
	   void Init()
	   {
	   	    memset(jz,0,sizeof(jz));
	   }
}st[13],mid;
matix mul(matix a,matix b)
{
	  matix c;
	  c.Init();
	  for(int i=1;i<=n;i++)
	  {
	  	  for(int k=1;k<=n;k++)
	  	  {
	  	  	  for(int j=1;j<=n;j++)
	  	  	  {
	  	  	      c.jz[i][j]+=a.jz[i][k]*b.jz[k][j];	  
	  	  	  }
	  	  }
	  }
	  return c;
}
matix my_pow(matix a,int b)
{
	  matix base;
	  base.Init();
	  for(int i=1;i<=n;i++) base.jz[i][i]=1;
      while(b)
      {
      	  if(b&1) 
      	  {
      	  	 base=mul(base,a);
      	  }
      	  a=mul(a,a);
      	  b>>=1;
      }
      return base;
}
int cnt;
bool check(int now)
{
	 
	 for(int i=0;i<=11;i++)
	 {
	 	 st[i].Init();
	 	 for(int j=1;j<=cnt;j++)
		 {
             if(lu[j].w<=now)
             {
             	st[i].jz[lu[j].u][lu[j].v]=1;
             	st[i].jz[lu[j].v][lu[j].u]=1;
             }
	     }
	 }
	 for(int i=0;i<=11;i++)
	 {
	 	for(int j=0;j<tim[(i+1)%12].size();j++)
		 {
		 	 int now1=tim[(i+1)%12][j];
		 	 for(int t=1;t<=n;t++)
		 	 {
		 	 	 st[i].jz[t][now1]=0;
		 	 }
		 }
	 }
	 mid.Init();
	 for(int i=1;i<=n;i++)
	 {
	 	 mid.jz[i][i]=1;
	 }
	 for(int i=0;i<=11;i++)
	 {
	 	 mid=mul(mid,st[i]);
	 }
//	 for(int i=1;i<=n;i++)
//	 {
//	 	for(int j=1;j<=n;j++)
//	 	{
//	 		cout<<mid.jz[i][j]<<" ";
//	 	}
//	 	cout<<endl;
//	 }
     int ci=k/12;
     int yu=k%12;
     mid=my_pow(mid,ci);
     for(int i=0;i<yu;i++)
     {
     	 mid=mul(mid,st[i]);
     }
     return mid.jz[s][t]!=0;
}
int maxn;
int vis[100][100];
signed main()
{
	cin>>n>>m>>s>>t>>k;
	for(int i=1;i<=m;i++)
	{
        int u,v,w;
        cin>>u>>v>>w;
		if(vis[u][v]) 
		{
			lu[vis[u][v]].w=w;
		}
		else
		{
			++cnt;
			lu[cnt].u=u;
			lu[cnt].v=v;
			vis[u][v]=vis[v][u]=cnt;
			lu[cnt].w=w;
		}
		maxn=max(maxn,lu[i].w);
	}
	int a;
	cin>>a;
    for(int i=1;i<=a;i++)
    {
    	int t;
    	cin>>t;
		for(int j=0;j<t;j++)
        {
        	cin>>a;
        	for(int v=j;v<=11;v+=t)
        	{
        		tim[v].push_back(a);
        	}
        }
    }
    int l=0,r=10000000,mid,ans=-INF;
    while(l<=r)
    {
    	int mid=(l+r)>>1;
    	if(check(mid))
    	{
    		r=mid-1;
    		ans=mid;
    	}
    	else l=mid+1;
    }
    if(ans==-INF)
    {
    	cout<<"'IMP0SSBLE!!'";
    	return 0;
    }
    cout<<ans<<endl;
}
2021/9/18 06:25
加载中...