【近期刷水合集】【P3171】【P1901】【P1054】【P2763】【P2761】【P1054】【P1269】【#5】

传送门太多就不传了……

P3171 费用流,每个格子的入度出度为一,连边跑就完了

/*
	ID:zky
	OJ:BZOJ
	Index:3171
	Language:C++
*/
#include<vector>
#include<queue>
#include<cstdio>
#include<cstring>
#include<climits>
#include<iostream>
#include<algorithm>
using namespace std;
struct edge{
	int u,v,cap,flow,cost;
	edge(int _u,int _v,int _cap,int _flow,int _cost):
		u(_u),v(_v),cap(_cap),flow(_flow),cost(_cost){}
	edge(){}
};
int n,m,s,t;
vector<edge>edges;
vector<vector<int> >G;
void add(int u,int v,int cap,int cost){
	edges.push_back(edge(u,v,cap,0,cost));
	G[u].push_back(edges.size()-1);
	edges.push_back(edge(v,u,0,0,-cost));
	G[v].push_back(edges.size()-1);
}
int d[500];
int a[500];
int p[500];
int vis[500];
int flow=0,cost=0;
bool spfa(){
	memset(d,0x7f,sizeof(d));
	queue<int>q;
	q.push(s);
	int B=d[0];
	d[s]=0;
	a[s]=INT_MAX;
	while(!q.empty()){
		int u=q.front();q.pop();vis[u]=0;
		for(int i=0;i<G[u].size();i++){
			edge e=edges[G[u][i]];
			if(d[e.v]>d[u]+e.cost&&e.cap>e.flow){
				d[e.v]=d[u]+e.cost;
				a[e.v]=min(a[u],e.cap-e.flow);
				p[e.v]=G[u][i];
				if(!vis[e.v]){
					vis[e.v]=1;
					q.push(e.v);
				}
			}
		}
	}
	if(d[t]==B)return false;
	flow+=a[t];
	cost+=a[t]*d[t];
	int u=t;
	while(u!=s){
		edges[p[u]].flow+=a[t];
		edges[p[u]^1].flow-=a[t];
		u=edges[p[u]].u;
	}
	return true;
}
int hash[16][16];
int tot=0;
int map[16][16];
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
int main(){
	cin>>n>>m;
	G.resize(n*m*2+10);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	hash[i][j]=++tot;
	string str;
	for(int i=1;i<=n;i++){
		cin>>str;
		for(int j=0;j<m;j++){
			if(str[j]=='L'){map[i][j+1]=2;}
			if(str[j]=='R'){map[i][j+1]=0;}
			if(str[j]=='U'){map[i][j+1]=3;}
			if(str[j]=='D'){map[i][j+1]=1;}
		}
	}
	s=0;t=n*m*2+1;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++){
		add(s,hash[i][j],1,0);
		add(hash[i][j]+n*m,t,1,0);
		for(int k=0;k<4;k++){
			int x=(i+dx[k])%n+1,y=(j+dy[k])%m+1;
			add(hash[i][j],hash[x][y]+n*m,1,(k!=map[i][j]));
		}
	}
	while(spfa());
	cout<<cost<<endl;
	return 0;
}


P1901

裸暴力可过……

/*
	ID:zky
	OJ:BZOJ
	Index:1901
	Language:C++
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[10010];
int b[10010];
int n,m;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	int l,r,k;
	string s;
	while(m--){
		cin>>s;
		if(s[0]=='Q'){
			cin>>l>>r>>k;
			for(int j=l;j<=r;j++)
			b[j]=a[j];
			sort(&b[l],&b[r+1]);
			cout<<b[l+k-1]<<endl;
		}else{
			cin>>l>>r;
			a[l]=r;
			
		}
	}
	return 0;	
}


P1054

暴力BFS

/*
	ID:zky
	OJ:BZOJ
	Index:1054
	Language:C++
*/
#include <map>
#include <vector>
#include <queue>
#include <cstdio>
#include <bitset>
#include <iostream>
#include <algorithm>
using namespace std;
typedef unsigned int uint;
map<uint,int>M;
string str;
uint s,t;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
vector<vector<int> >tomap(uint u){
	vector<vector<int> >map;
	map.resize(4);
	for(int i=3;i>=0;i--){
	map[i].resize(4);
		for(int j=3;j>=0;j--){
			map[i][j]=u&1;
			u>>=1;
		}	
	}
	return map;
}
uint toopt(const vector<vector<int> > &map){
	uint opt=0;
	for(int ii=0;ii<4;ii++)
	for(int jj=0;jj<4;jj++){
		opt<<=1;
		opt+=map[ii][jj];
	}	
	return opt;
}
void bfs(){
	queue<uint>q;
	q.push(s);
	M[s]=0;
	while(!q.empty()){
		uint u=q.front();
		q.pop();
		vector<vector<int> >map=tomap(u);
		for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
		if(map[i][j])
		for(int k=0;k<4;k++){
			int x=i+dx[k],y=j+dy[k];
			if(x<0||y<0||x>3||y>3||map[x][y])continue;
			swap(map[i][j],map[x][y]);
			int opt=toopt(map);
			if(!M.count(opt)){
				M[opt]=M[u]+1;
				q.push(opt);
				if(opt==t){
					cout<<M[t]<<endl;
					return;					
				}
			}
			swap(map[i][j],map[x][y]);						
		}
	}
}
int main(){
	for(int i=0;i<4;i++){
		cin>>str;
		for(int j=0;j<4;j++){
			s<<=1;
			s+=str[j]-'0';
		}
	}
	for(int i=0;i<4;i++){
		cin>>str;
		for(int j=0;j<4;j++){
			t<<=1;
			t+=str[j]-'0';
		}
	}
	if(s==t){
		cout<<0<<endl;
		return 0;
	}
	bfs();
	return 0;
}


P2761

太水了……

/*
	ID:zky
	OJ:BZOJ
	Index:2761
	Language:C++
*/
#include <map>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
map<unsigned,bool>hash;
int first=1;
int main(){
	int T,n,x;
	scanf("%d",&T);
	while(T--){
		first=1;
		scanf("%d",&n);
		while(n--){
			scanf("%d",&x);
			if(!hash.count(x)){
				if(!first)
				printf(" %d",x);
				else{
					first=0;
					printf("%d",x);
				}
				hash[x]=true;
			}
		}
		printf("\n");
		hash.clear();
	}
	return 0;
}

P2763

层次图最短路

#include <queue>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
#define X first
#define Y second
using namespace std;
int n,m,k;
struct edge{
	int u,v,w;
};
vector<edge>edges;
vector<int>G[200101];
void add(int u,int v,int w){
	edges.push_back((edge){u,v,w});
	G[u].push_back(edges.size()-1);
}
int u,v,w,s,t;
int d[200101];
int vis[200101];
typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii> >q;
void Dijk(){
	memset(d,0x7f,sizeof(d));
	d[s]=0;
	q.push(pii(d[s],s));
	while(!q.empty()){
		int u=q.top().Y;q.pop();
		if(vis[u])continue;
		vis[u]=1;
		for(int i=0;i<G[u].size();i++){
			edge e=edges[G[u][i]];
			if(d[e.v]>d[u]+e.w){
				d[e.v]=d[u]+e.w;
				q.push(pii(d[e.v],e.v));
			}
		}
	}
	cout<<d[t]<<endl;
}
int main(){
	 cin>>n>>m>>k;
	 cin>>s>>t;
	 t+=n*k;
	 for(int i=1;i<=m;i++){
	 	cin>>u>>v>>w;
	 	for(int j=0;j<=k;j++){
	 		add(u+j*n,v+j*n,w);
	 		add(v+j*n,u+j*n,w);
	 		add(u+j*n,v+(j+1)*n,0);
	 		add(v+j*n,u+(j+1)*n,0);
	 	}
	 }
	 int deb=0;
	 if(deb)
	 for(int i=0;i<edges.size();i++){
	 	printf("#%d  %d -> %d  w:%d\n",
		 i,edges[i].u,edges[i].v,edges[i].w);
	 }
	 Dijk();
	return 0;
}


P1269

Rope水过

/*
	ID:zky
	OJ:BZOJ
	Index:1269
	Language:C++
*/
#include <cstdio>
#include <ext/rope>
#include <iostream>
#include <algorithm>
using namespace std;
using namespace __gnu_cxx;
crope a,b,tmp;
char s[10];
int now,n,len,size;
char str[2000000],rstr[2000000];
int main(){
	scanf("%d",&n);
	while(n--){
		scanf("%s",s);
		switch(s[0]){
			case 'M':{scanf("%d",&now);break;}
			case 'P':{now--;break;}
			case 'N':{now++;break;}
			case 'G':{putchar(a[now]);putchar('\n');break;}
			case 'I':{
				scanf("%d",&size);
				len=a.length();
				for(int i=0;i<size;i++){
					do{str[i]=getchar();}
					while(str[i]=='\n');
					rstr[size-i-1]=str[i];
				}
				rstr[size]=str[size]='\0';
				a.insert(now,str);
				b.insert(len-now,rstr);
				break;
			}
			case 'D':{
				scanf("%d",&size);
				len=a.length();
				a.erase(now,size);
				b.erase(len-now-size,size);
				break;
			}
			case 'R':{
				scanf("%d",&size);
				len=a.length();
				tmp=a.substr(now,size);
				a=a.substr(0,now)+b.substr(len-now-size,size)+a.substr(now+size,len-now-size);
				b=b.substr(0,len-now-size)+tmp+b.substr(len-now,now);				
				break;
			}
		}		
	}
	return 0;
}


你可能感兴趣的:(网络流,bzoj)