其实这是前天的事了。(现在时间回到两天前)
今天的主要内容是最短路和2-SAT
最短路我做了一题:水灾;题目详情见9018-1452
先bfs求出洪水漫延到每一个点的时间。
然后再跑一遍bfs求出最短路即可。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int INF=0x7fffffff; int n,m,sx,sy,dx,dy,h=0,now=0; int t[51][51],map[51][51]={0}; char c[51]; struct hs{int x,y,s;}q[10010]; int xx[4]={-1,0,0,1},yy[4]={0,-1,1,0}; void bfs(){ while(now!=h){ int x=q[now].x,y=q[now].y;now++; for(int i=0;i<4;i++){ int nx=x+xx[i],ny=y+yy[i]; if(nx>n||ny>m||nx<1||ny<1||map[nx][ny])continue; if((nx==dx&&ny==dy)||t[nx][ny]!=INF)continue; t[nx][ny]=t[x][y]+1;q[h].x=nx;q[h].y=ny;h++; } } } void BFS(){ now=0;h=1;q[0].x=sx;q[0].y=sy;q[0].s=0; while(now!=h){ int x=q[now].x,y=q[now].y,s=q[now].s;now++; for(int i=0;i<4;i++){ int nx=x+xx[i],ny=y+yy[i]; if(nx>n||ny>m||nx<1||ny<1||map[nx][ny]||s+1>=t[nx][ny])continue; map[nx][ny]=1; if(nx==dx&&ny==dy){printf("%d",s+1);return;} q[h].x=nx;q[h].y=ny;q[h].s=s+1;h++; } } printf("ORZ hzwer!!!"); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)t[i][j]=INF; for(int i=1;i<=n;i++){ scanf("%s",c); for(int j=1;j<=m;j++){ if(c[j-1]==‘D‘)dx=i,dy=j; else if(c[j-1]==‘S‘)sx=i,sy=j; else if(c[j-1]==‘X‘)map[i][j]=1; else if(c[j-1]==‘*‘){q[h].x=i;q[h].y=j;t[i][j]=0;h++;} } } bfs();BFS(); return 0; }
关于2-SAT有这样一题:Astronauts;题目详情见UVA1391或UVALive3713
这题就是简单的2-SAT模板
详情见代码
#include<iostream> #include<cstdio> #include<vector> #include<cstring> using namespace std; inline int read(){ int num=0,t=1;char c=getchar(); while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();} return num*t; } const int maxn=100010; int n,m,mark[maxn*2],s[maxn*2],c; vector<int> g[maxn*2]; void add(int x,int a,int y,int b){ x=x*2+a;y=y*2+b; g[x^1].push_back(y);g[y^1].push_back(x); } bool dfs(int x){ if(mark[x^1])return 0; if(mark[x])return 1; mark[x]=1;s[c++]=x; for(int i=0;i<g[x].size();i++)if(!(dfs(g[x][i])))return 0; return 1; } bool solve(){ for(int i=0;i<n*2;i+=2){ if(!mark[i]&&!mark[i+1]){ c=0; if(!dfs(i)){ while(c>0)mark[s[--c]]=0; if(!(dfs(i+1)))return 0; } } } return 1; } int tot,age[maxn]; int is_young(int x){ return age[x]*n<tot; } int main() { while(1) { n=read();m=read();if(n+m==0)break; tot=0;for(int i=0;i<2*n;i++)g[i].clear();memset(mark,0,sizeof(mark)); for(int i=0;i<n;i++)age[i]=read(),tot+=age[i]; for(int i=1;i<=m;i++){ int a,b;a=read();b=read();a--;b--;if(a==b)continue; add(a,1,b,1);if(is_young(a)==is_young(b))add(a,0,b,0); } if(!solve())puts("No solution."); else for(int i=0;i<n;i++) if(mark[i*2])puts("C"); else if(is_young(i))puts("B"); else puts("A"); } return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
时间: 2024-10-11 12:37:13