60分求助
查看原帖
60分求助
361773
lishenghao楼主2022/7/23 14:06
#include<bits/stdc++.h>
#define A 1000
#define N 60000+5
using namespace std;
string s;
int m,n,dis1[N];
bool vis[N];
struct node{int to,dis;};
vector<node>g[N];
priority_queue<pair<int,int> >q;
void build(int fl)
{
	int i,cnt=0,tmp[505],sum=0;
	memset(tmp,0,sizeof(tmp));
	for(i=0; i<s.size(); i++)
	{
		if(isdigit(s[i]))
			sum=(sum<<1)+(sum<<3)+s[i]-'0';
		else if(sum)tmp[++cnt]=sum,sum=0;
	}
	tmp[++cnt]=sum;
	for(i=1; i<cnt; i++)
	{
		g[tmp[i]+fl*A].push_back((node){tmp[i+1]+fl*A,0});
//		cout<<tmp[i]+fl*A<<" "<<tmp[i+1]+fl*A<<endl;
	}
}
void dij()
{
    int i,fr;
    memset(dis1,127,sizeof(dis1));
    for(int k=0; k<=m; k++)
    {
    	dis1[1+A*k]=0;
    	q.push(make_pair(0,1+A*k));
	}
    while(!q.empty())
    {
        fr=q.top().second;
//      printf("%d ",fr);
        q.pop();
        if(vis[fr])continue;
        vis[fr]=1;
        for(i=0; i<g[fr].size(); i++)
        {
            int t=g[fr][i].to,ds=g[fr][i].dis;
            if(dis1[fr]+ds<dis1[t])
            {
                dis1[t]=dis1[fr]+ds;
                q.push(make_pair(-dis1[t],t));
            }
        }
    }
}
int main()
{
	int i,k;
	scanf("%d%d",&m,&n);
	m--;getline(cin,s);
	for(k=0; k<=m; k++)
	{
		getline(cin,s);
		build(k);
	}
	for(k=0; k<m; k++)
		for(i=1; i<=n; i++)
			g[i+A*k].push_back((node){i+A*k+A,1}),
			g[i+A*k+A].push_back((node){i+A*k,1});
	dij(); int ans=2e9;
	for(k=0; k<=m; k++)
	{
//		printf("%d ",A*k+n);
		ans=min(ans,dis1[A*k+n]);
	}
	if(ans==2e9)printf("NO");
	else printf("%d",ans);
}
2022/7/23 14:06
加载中...