NEUQ-ACM预备队必做题5.0

B3647 【模板】Floyd

floyd,这个遍历每个中间点

#include<bits/stdc++.h>
#define ll long long
#define f(i,a,b) for(int (i)=(a);(i)<=(b);++(i))
#define lowbit(x) (x)&-1*(x)
using namespace std; 
int way[101][101];
const int inf=100000;
int main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n,m,a,b,c;
	cin>>n>>m;
	f(i,1,n)
	  	f(j,1,n){
	  		if(i!=j)
    	  		way[i][j]=inf;
		  }
	f(i,1,m){
		cin>>a>>b>>c;
		way[a][b]=c,way[b][a]=c;
	}
	f(i,1,n)
	  	f(j,1,n)
	  	  	f(k,1,n){
	  	  		if(j==k) continue;
	  	  		way[j][k]=way[k][j]=min(way[j][k],way[j][i]+way[i][k]);
				}
	f(i,1,n){
	  	f(j,1,n)
	  		cout<<way[i][j]<<' ';
	  		cout<<'\n';
	     }
	return 0;     
}

P4779 【模板】单源最短路径(标准版)

本来想用vector解决空间的问题,最后还是用一维数组模拟。堆优化

#include <bits/stdc++.h>
#define f(i,a,b) for(int (i)=(a);(i)<=(b);++(i))
#define Ma(x,y) make_pair((x),(y))
const int N=1000010,M=2000010;
using namespace std;
int read() {
    int X=0,w=1; 
    char c=getchar();
    while (c<'0'||c>'9') { 
        if (c=='-') w=-1; 
        c=getchar(); 
    }
    while (c>='0'&&c<='9') 
        X=X*10+c-'0',c=getchar(); 
    return X*w;
}

int st[N],di[N],vis[N],v[M],to[M],nex[M],n,m,s;
void ad(int fr,int to1,int v1,int i) {
    nex[i]=st[fr];
    v[i]=v1;
    to[i]=to1;
    st[fr]=i;
}

priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
void d(int s){
    memset(di,0x3f,sizeof(di));
    di[s]=0;
    while(!q.empty()) q.pop();
    q.push(Ma(0,s));
    while(!q.empty()){
        int cv=q.top().first,cto=q.top().second;
        q.pop(); 
        vis[cto]=1;
        for(int i=st[cto];i;i=nex[i]){
            int va=cv+v[i],to1=to[i];
            if(di[to1]>va){
                di[to1]=va;
                q.push(Ma(va,to1));
            }
        }
    }
}

int main(){
    n=read(),m=read(),s=read();
    f(i,1,m){
        int a,b,c;
        a=read(),b=read(),c=read();
        ad(a,b,c,i);
    }
    d(s);
    f(i,1,n) {
        printf("%d ",di[i]); 
    }
}

P2661 [NOIP2015 提高组] 信息传递

并查集,路径压缩

#include <bits/stdc++.h>
#define f(i,a,b) for(int (i)=(a);(i)<=(b);++(i))
#define Ma(x,y) make_pair((x),(y))
const int N=1000010,M=200002;
int ans=0x7777777fffffff;
using namespace std;
int read() {
    int X=0,w=1; 
    char c=getchar();
    while (c<'0'||c>'9') { 
        if (c=='-') w=-1; 
        c=getchar(); 
    }
    while (c>='0'&&c<='9') 
        X=X*10+c-'0',c=getchar(); 
    return X*w;
}
int n; 
int fa[M],siz[M];
inline int find(const int x)
{
	if(fa[x]!=x)
	{
		int last=fa[x];
		fa[x]=find(fa[x]);
		siz[x]+=siz[last];
	}
	
	return fa[x];
} 
inline void add(int x,int y)
{
	int fa1=find(x),fa2=find(y);
	if(fa1!=fa2){
		fa[fa1]=fa2;
		siz[x]=siz[y]+1;
	}
	else 
	 ans=min(ans,siz[x]+siz[y]+1);
	return; 
}

int main(){
    n=read();
    f(i,1,n){
		fa[i]=i;
    } 
    f(i,1,n){
	   int a;
	   a=read();
	   add(i,a);
	}
	cout<<ans;
	return 0;   
}


P1144 最短路计数

dijkstra

#include<bits/stdc++.h>
#define f(i,a,b) for(int (i)=(a);(i)<=(b);++i)
#define bitlow(a) ((a)&-1*(a))
using namespace std;

struct node{
	int dis,to;
};

const int mod=100003,M=2000002,N=1000002;
int n,m,cnt=0;
int sta[N],nex[M*2],to[M*2],vis[N];
unsigned long long dis_num[N],dis[N];

inline int read()
{
	int X=0,w; char a=getchar();
	while(a<'0'||a>'9'){
		if(a=='-')
		  w=-1;
		a=getchar();
	}
	while(a>='0'&&a<='9'){
	    X=X*10+a-'0';
		a=getchar();
	}
	return X; 
}

inline void add(const int x,const int y)
{
	++cnt;
	nex[cnt]=sta[x];
	to[cnt]=y;
	sta[x]=cnt;
	return;
}

void print()
{
	f(i,1,n)
	    printf("%d\n",dis_num[i]%mod);
}
void dijkstra(const int start)//  dis==1
{
	memset(dis,0x7f,sizeof(dis));
	dis[start]=0,dis_num[start]=1;
	queue<node> q;	
	q.push((node){1,start});
	while(!q.empty())
	{
		node cur=q.front();
		q.pop();
		if(vis[cur.to]) continue;
		vis[cur.to]=1;
		int v=cur.dis+1;
		for(int i=sta[cur.to];i;i=nex[i])
		  {
		  	int to1=to[i];
		  	if(dis[to1]>v){ 
		  		dis[to1]=v;
			    dis_num[to1]=0; 
			} 
			if(v==dis[to[i]]){
				dis_num[to1]+=dis_num[cur.to]%mod;
				q.push((node){cur.dis+1,to[i]}); 
			}		        
		  }
	}
}
int main()
{
	n=read(),m=read();
	f(i,1,m){
		int a,b;
		a=read(),b=read();
		if(a==b) continue;
		add(a,b);
		add(b,a);
	}
	dijkstra(1);
	print();  
    return 0;    
}
 

P8794 蓝桥杯 2022 国 A] 环境治理

二分+弗洛伊德

#include<bits/stdc++.h>
#define f(i,a,b) for(int (i)=(a);(i)<=(b);++i)
#define bitlow(a) ((a)&-1*(a))
#define Ma(x,y) make_pair((x),(y))
using namespace std;
const int mod=100003,M=2000002,N=108;
int Q,v[N][N],low[N][N];
int n;
inline int read()
{
	int X=0,w; char a=getchar();
	while(a<'0'||a>'9'){
		if(a=='-')
		  w=-1;
		a=getchar();
	}
	while(a>='0'&&a<='9'){
	    X=X*10+a-'0';
		a=getchar();
	}
	return X; 
}
inline check(int x)
{
	int dis[N][N]; 
	f(i,1,n){
	  int t=x/n+(x%n>=i?1:0);
	  f(j,1,n)	
	  	dis[i][j]=max(low[i][j],v[i][j]-t);
	  }
	
	int sum=0;
	
	f(k,1,n)
	  f(i,1,n)
	    f(j,1,n)
	    	dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);		
	
	f(i,1,n)
	  f(j,1,n)
	    sum+=dis[i][j];
	    
      return sum; 
}
	
int main()
{
	n=read(),Q=read();
	f(i,1,n)
	  f(j,1,n)
	  	v[i][j]=read();	   	
	f(i,1,n)
	  f(j,1,n){
	  	low[i][j]=read();
	  }
	int ans=-1;
	int l=0,r=100000*n;
	while(l<=r)
	{
		int mid=(l+r)/2;
		if(check(mid)<=Q){
			r=mid-1;
			ans=mid;
		}
		else
		  l=mid+1;
	}
	printf("%d\n",ans);
	return 0;      
}
 

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值