消息处理器(40
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll base=233; const int MAXN=1e4+10; #define pi acos(-1.0) #define INF 0x3f3f3f3f #define mod 1e9+7 #define lson rt<<1,l,mid #define endll printf("\n") #define pii pair<int, int> #define rson rt*2+1,mid+1,r #define s1(a) scanf("%d",&a) #define stop system("pause") #define lowbit(x) ((x)&(-x)) #define s2(a,b) scanf("%d %d",&a,&b) #define mem(a,b) memset(a,b,sizeof(a)) #define s3(a,b,c) scanf("%d %d %d",&a,&b,&c) int T,n,m; struct IN { int u,v,op,t;// IN (int uu,int vv,int oo,int tt):u(uu),v(vv),op(oo),t(tt){}; friend bool operator <(IN a,IN b) { if(a.t!=b.t) return a.t<b.t; return a.op<b.op; } }; priority_queue<IN>q; int main() { scanf("%d %d\n",&T,&n); while(T--) { while(!q.empty()) q.pop(); string s; for(int i=0;i<n;i++) { getline(cin,s); int len=s.size(),tt=0; for(int j=0;j<len;j+=3) { if(s[j]=='S') q.push(IN(i,s[j+1]-'0',1,tt++)); else q.push(IN(s[j+1]-'0',i,2,tt++)); } } queue<IN>pp[MAXN]; int size=0; while(!q.empty()) { IN tmp=q.top();q.pop(); int u=tmp.u,v=tmp.v; if(tmp.op==1) { IN tmp2=IN(u,v,1,1); if(pp[v].empty()) { pp[u].push(tmp2); size++; } else { IN tmp3=pp[v].front(); if(tmp3.op==2&&tmp3.u==u) { pp[v].pop(); if(pp[v].empty()) size--; } else pp[u].push(tmp2); } } else { IN tmp2=IN(u,v,2,1); if(pp[u].empty()) { pp[v].push(tmp2); size++; } else { IN tmp3=pp[u].front(); if(tmp3.op==1&&tmp3.v==v) { pp[u].pop(); if(pp[u].empty()) size--; } else pp[v].push(tmp2); } } } if(size) printf("1\n"); else printf("0\n"); } //stop; return 0; }
淦,我是傻子嘛,想到了队列模拟都没想到根本不用判断时间
100分代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll base=233; const int MAXN=1e4+10; #define pi acos(-1.0) #define INF 0x3f3f3f3f #define mod 1e9+7 #define lson rt<<1,l,mid #define endll printf("\n") #define pii pair<int, int> #define rson rt*2+1,mid+1,r #define s1(a) scanf("%d",&a) #define stop system("pause") #define lowbit(x) ((x)&(-x)) #define s2(a,b) scanf("%d %d",&a,&b) #define mem(a,b) memset(a,b,sizeof(a)) #define s3(a,b,c) scanf("%d %d %d",&a,&b,&c) int T,n,m; struct IN { int u,v,op;// IN (int uu,int vv,int oo):u(uu),v(vv),op(oo){}; }; string s; queue<IN>q[MAXN]; int main() { scanf("%d %d\n",&T,&n); while(T--) { for(int i=0;i<n;i++) { while(q[i].size()) q[i].pop(); getline(cin,s); int len=s.size(); int op; for(int j=0;j<len;) { if(s[j]=='S') op=1; else if(s[j]=='R') op=2; j++; int num=0; while(s[j]>='0'&&s[j]<='9') num=num*10+s[j]-'0',j++; q[i].push(IN(i,num,op)); j++; } } while(1) { bool flag=false; for(int i=0;i<n;i++) { if(q[i].empty()) continue; IN tmp=q[i].front(); if(q[tmp.v].empty()) break; IN tmp2=q[tmp.v].front(); if(tmp2.op+tmp.op==3&&tmp2.v==i) { q[i].pop(); q[tmp.v].pop(); flag=true; i--; } } if(!flag) break; } bool flag=true; for(int i=0;i<n;i++) { if(q[i].size()) { printf("1\n"); flag=false;break; } } if(flag) printf("0\n"); } return 0; }
交通规划
单源最短路都这么明显了!不要乱想别的了。。。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll base=233; const int MAXN=1e5+10; #define pi acos(-1.0) #define INF 0x3f3f3f3f #define mod 1e9+7 #define lson rt<<1,l,mid #define endll printf("\n") #define pii pair<int, int> #define rson rt*2+1,mid+1,r #define s1(a) scanf("%d",&a) #define stop system("pause") #define lowbit(x) ((x)&(-x)) #define s2(a,b) scanf("%d %d",&a,&b) #define mem(a,b) memset(a,b,sizeof(a)) #define s3(a,b,c) scanf("%d %d %d",&a,&b,&c) struct Graph { int tot,head[MAXN]; struct IN{int v,next,w;}edge[MAXN<<1]; void init(){mem(head,-1);tot=0;} void addedge(int u,int v,int w) { edge[tot].v=v;edge[tot].w=w; edge[tot].next=head[u];head[u]=tot++; } int Start(int u){return head[u];} int To(int i){return edge[i].v;} int Val(int i){return edge[i].w;} int Next(int i){return edge[i].next;} }G; int n,m; int dis[MAXN],vis[MAXN]; void input() { s2(n,m);G.init(); for(int i=0;i<m;i++) { int u,v,w;s3(u,v,w); G.addedge(u,v,w); G.addedge(v,u,w); } } int cost[MAXN]; int dij(int x)//x=start { priority_queue<pii > q;// 第一关键字为距离,第二关键字为点 mem(dis,INF);mem(vis,0); q.push(make_pair(0,x)); dis[x]=0; while(q.size()) { int u=q.top().second; //取出点 q.pop(); if (vis[u]) continue; vis[u]=1; for (int i=G.Start(u);~i;i=G.Next(i)) { int v=G.To(i); if (dis[v]>dis[u]+G.Val(i)) { dis[v]=dis[u]+G.Val(i); cost[v]=G.Val(i); //因为更新到某点的最短路肯定是前面的最短路加了一条边(仅仅一条) //所以每条边的花费仅仅为新增加的这一条 q.push(make_pair(-dis[v],v)); //入堆,因为需要最小的边所以这里丢进去负值用于排序 } else if(dis[v]==dis[u]+G.Val(i)) cost[v]=min(cost[v],G.Val(i));// } } int ans=0; for(int i=2;i<=n;i++) ans+=cost[i]; return ans; } int main() { input(); mem(cost,0); printf("%d\n",dij(1)); //stop; return 0; }送货(DFS非递归
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll base=233; const int MAXN=1e4+10; #define pi acos(-1.0) #define INF 0x3f3f3f3f #define mod 1e9+7 #define lson rt<<1,l,mid #define endll printf("\n") #define pii pair<int, int> #define rson rt*2+1,mid+1,r #define s1(a) scanf("%d",&a) #define stop system("pause") #define lowbit(x) ((x)&(-x)) #define s2(a,b) scanf("%d %d",&a,&b) #define mem(a,b) memset(a,b,sizeof(a)) #define s3(a,b,c) scanf("%d %d %d",&a,&b,&c) //原始数据 int n,m; set<int>g[MAXN]; //判断连通性 int pre[MAXN],du[MAXN]; int fund(int x){return x==pre[x]?x:pre[x]=fund(pre[x]);} void join(int x,int y){pre[fund(x)]=fund(y);} //求欧拉路 stack<int>path; bool vis[MAXN][MAXN]; int nxt(int u) { set<int>::iterator it; for(it=g[u].begin();it!=g[u].end();it++) if(!vis[u][*it]) return *it; return -1; } void dfs(int s) { stack<int>st; st.push(s); while(!st.empty()) { int u=st.top(); int v=nxt(u); if(v!=-1) { vis[u][v]=vis[v][u]=true; st.push(v); } else { st.pop(); path.push(u); } } } int main() { s2(n,m); for(int i=0;i<=n;i++) pre[i]=i,du[i]=0; for(int i=0;i<m;i++) { int u,v;s2(u,v); g[u].insert(v); g[v].insert(u); if(fund(u)!=fund(v)) join(u,v); du[u]++;du[v]++; } //判断连通性 int cnt=0,tag=0; for(int i=1;i<=n;i++) { if(i==pre[i]) cnt++; if(du[i]%2) tag++; } if(cnt>1||(tag!=0&&tag!=2)) { printf("-1\n"); return 0; } // mem(vis,0); dfs(1); while(!path.empty()) { printf("%d ",path.top()); path.pop(); } endll; //stop; return 0; }游戏(BFS
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll base=233; const int MAXN=1e6+10; #define pi acos(-1.0) #define INF 0x3f3f3f3f #define mod 1e9+7 #define lson rt<<1,l,mid #define endll printf("\n") #define pii pair<int, int> #define rson rt*2+1,mid+1,r #define s1(a) scanf("%d",&a) #define stop system("pause") #define lowbit(x) ((x)&(-x)) #define s2(a,b) scanf("%d %d",&a,&b) #define mem(a,b) memset(a,b,sizeof(a)) #define s3(a,b,c) scanf("%d %d %d",&a,&b,&c) int n,m,t; struct I { int a,b; }lim[111][111]; struct IN { int x,y,t; IN(){}; IN(int xx,int yy,int tt):x(xx),y(yy),t(tt){}; }; int dx[4]={0,0,1,-1}; int dy[4]={-1,1,0,0}; bool vis[110][110][333]; int check(int x,int y,int t) { if(x<=0||y<=0||x>n||y>m||vis[x][y][t]) return 0; if(lim[x][y].a<=t&&lim[x][y].b>=t) return 0; return 1; } int bfs() { queue<IN>q; q.push(IN(1,1,0)); vis[1][1][0]=true; while(q.size()) { int x=q.front().x,y=q.front().y,t=q.front().t; q.pop(); for(int i=0;i<4;i++) { int nx=x+dx[i],ny=y+dy[i],nt=t+1; if(check(nx,ny,nt)) { if(nx==n&&ny==m) return nt; vis[nx][ny][nt]=true; q.push(IN(nx,ny,nt)); } } } return -1; } int main() { s3(n,m,t); mem(lim,-1);mem(vis,false); for(int i=0;i<t;i++) { int r,c,a,b;s2(r,c);s2(a,b); lim[r][c].a=a,lim[r][c].b=b; } printf("%d\n",bfs()); //stop; return 0; }