求助大佬,悬赏亿个关注
  • 板块学术版
  • 楼主_Panyc
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/4/29 16:27
  • 上次更新2024/4/29 19:29:07
查看原帖
求助大佬,悬赏亿个关注
818558
_Panyc楼主2024/4/29 16:27

题目在这里

这是现在的代码:

#include<bits/stdc++.h>
using namespace std;
const int N=250010;
int h[N],e[N],w[N],ne[N],idx,n,m,dist[N];bool st[N];
typedef pair<int,int> PII;
void add(int a,int b,int c){
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dijstra(){
    priority_queue<PII,vector<PII>,greater<PII> > heap;
    memset(dist,0x3f,sizeof dist);
    dist[0]=0;
    heap.push({0,0});
    while(heap.size()){
        PII t=heap.top();
        int v=t.second,d=t.first;
        heap.pop();
        if(st[v])continue;
        st[v]=1;
        for(int i=h[v];i!=-1;i=ne[i]){
            int j=e[i];
            if(dist[j]>d+w[i]){
                dist[j]=d+w[i];
                heap.push({dist[j],j});
            }
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    memset(h,-1,sizeof h);
    if((n+m)%2==0){
    	cout<<"NO SOLUTION";
    	return 0;
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			char c;
			cin>>c;
			if(c=='/')
				if((i+j)%2==0) add(i*m+j,i*(m+1)+j+1,0),add(i*(m+1)+j+1,i*m+j,0);
				else add(i*m+j,i*(m+1)+j+1,1),add(i*(m+1)+j+1,i*m+j,1);
			else
				if((i+j)%2==0) add(i*m+j+1,i*(m+1)+j,1),add(i*(m+1)+j,i*m+j+1,1);
				else add(i*m+j+1,i*(m+1)+j,0),add(i*(m+1)+j,i*m+j+1,0);
		}
	}
    dijstra();
    cout<<dist[n];
}

我用的是dijstra堆优化+邻接表

2024/4/29 16:27
加载中...