88pts spfa求调
查看原帖
88pts spfa求调
623254
Soul_direction楼主2024/5/26 10:14

吸氧 88pts,求苣佬调。

#pragma gcc optimize(2)
#include <iostream>
#include <algorithm>
#include <queue>
#define maxn 1500010
#define inf 2147483647
using namespace std;
int n,m,s=1;
int head[maxn],to[maxn],nxt[maxn],cnt,dis[maxn];
short val[maxn];
bool vis[maxn];
void addage(int u,int v,int w){
	to[++cnt]=v;
	val[cnt]=w;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
void add(int u,int v,int w){
	addage(u,v,w);
	addage(v,u,w);
}
queue<int> qwq;
void spfa(){
	for(int i=1;i<=(n+1)*(m+1);i++){
		vis[i]=0;
		dis[i]=inf;
	}
	dis[s]=0;
	vis[s]=1;
	qwq.push(s);
	while(!qwq.empty()){
		int u=qwq.front();
		qwq.pop();
		vis[u]=0;
		for(int i=head[u];i;i=nxt[i]){
			if(dis[to[i]]>dis[u]+val[i]){
				dis[to[i]]=dis[u]+val[i];
				if(!vis[to[i]]){
					qwq.push(to[i]);
					vis[to[i]]=1;
				}
			}
		}
	}
}
inline int read(){
    int x=0,f; char ch=0;
    while(!isdigit(ch)) f=(ch=='-'?-1:1),ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return x*f;
}
inline void print(int x){
    if(x<0) x=-x,putchar('-');
    if(x>9) print(x/10);
    putchar(x%10+48);
}
inline void write(int x){print(x);putchar('\n');}
signed main(){
	n=read(),m=read();
	if((n+m)%2==1){
		cout<<"NO SOLUTION"<<endl;
		exit(0);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char v;
			cin>>v;
			if(v=='/'){
				add(((i-1)*(m+1)+j+1),(i*(m+1)+j),0);
				add(((i-1)*(m+1)+j),(i*(m+1)+j+1),1);
			}else{
				add(((i-1)*(m+1)+j+1),(i*(m+1)+j),1);
				add(((i-1)*(m+1)+j),(i*(m+1)+j+1),0);
			}
		}
	}
	spfa();
	write(dis[(n+1)*(m+1)]);
	return 0;
}
2024/5/26 10:14
加载中...