• 个人简介

    Bellman-ford

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int n,m,s,d[500001]; 
    struct pio{
    	int u,v,w;
    }z[500001]; 
    signed main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin>>n>>m>>s;
    	for(int i=1;i<=n;i++){
    		d[i]=0x7fffffff;
    	}d[s]=0;
    	for(int i=1;i<=m;i++){
    		cin>>z[i].u>>z[i].v>>z[i].w;
    	}for(int i=1;i<=n;i++){
    		bool flag=0;
    		for(int j=1;j<=m;j++){
    			int u=z[j].u,v=z[j].v,w=z[j].w;
    			if(d[v]>d[u]+w){
    				d[v]=d[u]+w;
    				flag=true;
    			}
    		}if(!flag)break;
    	}for(int i=1;i<=n;i++)cout<<d[i]<<" ";
    	return 0;
    }
    

    Dijkstra

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,s,d[50001],vis[50001];
    struct pio{
    	int v,w;
    };
    vector<pio>z[50001]; 
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin>>n>>m>>s;
    	for(int i=1;i<=m;i++){
    		int u,v,w;
    		cin>>u>>v>>w;
    		z[u].push_back({v,w});
    	}for(int i=1;i<=n;i++)d[i]=1e9;
    	d[s]=0;
    	for(int i=1;i<n;i++){
    		int maxn=1e9,t;
    		for(int j=1;j<=n;j++){
    			if(!vis[j]&&d[j]<maxn){
    				maxn=d[j];
    				t=j;
    			}
    		}vis[t]=1;
    		for(int j=0;j<z[t].size();j++){
    			int v=z[t][j].v,w=z[t][j].w;
    			if(d[v]>d[t]+w){
    				d[v]=d[t]+w;
    			}
    		}
    	}for(int i=1;i<=n;i++)cout<<(d[i]==1e9?(1<<31)-1:d[i])<<" ";
    	
    	return 0;
    }
    

    floyd

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,dp[101][101]; 
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin>>n>>m;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			dp[i][j]=1e9;
    		}dp[i][i]=0;
    	}
    	for(int i=1;i<=m;i++){
    		int u,v,w;
    		cin>>u>>v>>w;
    		dp[u][v]=min(dp[u][v],w); 
    		dp[v][u]=min(dp[u][v],w);
    	}for(int k=1;k<=n;k++){
    		for(int i=1;i<=n;i++){
    			for(int j=1;j<=n;j++){
    				dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
    			}
    		}
    	}for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			cout<<dp[i][j]<<" ";
    		}cout<<"\n";
    	}
    	return 0;
    }
    

    spfa

    void spfa() {
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
        memset(dist, INF, sizeof(dist));
        memset(inQueue, false, sizeof(inQueue));
        dist[1] = 0;
        pq.push({0, 1});
        inQueue[1] = true;
        while (!pq.empty()) {
            int u = pq.top().second; pq.pop();
            inQueue[u] = false;
            for (auto &e : edges[u]) {
                int v = e.first, w = e.second;
                if (dist[v] > dist[u] + w) {
                    dist[v] = dist[u] + w;
                    if (!inQueue[v]) {
                        pq.push({dist[v], v});
                        inQueue[v] = true;
                    }
                }
            }
        }
    }
    

    Dijkstra优化

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    int n,m,s,d[500001],vis[500001];
    struct pio{
    	int v,w;
    };
    struct node{
    	int dis,u;
    	bool operator>(const node& a) const { return dis > a.dis; }
    };
    vector<pio>z[500001]; 
    priority_queue<node, vector<node>, greater<node> > q;
    
    signed main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin>>n>>m>>s;
    	for(int i=1;i<=m;i++){
    		int u,v,w;
    		cin>>u>>v>>w;
    		z[u].push_back({v,w});
    	}for(int i=1;i<=n;i++)d[i]=1e9;
    	d[s]=0;
    	q.push({0,s});
    	while(!q.empty()){
    		int u=q.top().u;
    		q.pop();
    		if(vis[u])continue;
    		vis[u]=1;
    		for(int j=0;j<z[u].size();j++){
    			int v=z[u][j].v,w=z[u][j].w;
    			if(d[v]>d[u]+w){
    				d[v]=d[u]+w;
    				q.push({d[v],v});
    			}
    		}
    	}
    	for(int i=1;i<=n;i++)cout<<d[i]<<" ";
    	
    	return 0;
    }
    

    二分图

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a,b,vis[10010],ans;
    vector<int> z[10010];
    bool dfs(int u,int c){
    	vis[u]=c;
    	c==1?a++:b++;
    	for(int i=0;i<z[u].size();i++){
    		if(vis[z[u][i]]==c||(!vis[z[u][i]]&&!dfs(z[u][i],3-c)))return false;
    	}
    	return true;
    }
    int main(){
    	int n,m;
    	cin>>n>>m;
    	for(int i = 1;i <= m;i++){
    		int u,v;
    		cin>>u>>v;
    		z[u].push_back(v);
    		z[v].push_back(u);
    	}	
    	for(int i = 1;i <= n;i++){
    		if(!vis[i]&&!dfs(i,1)){
    			cout<<"Impossible";
    			return 0;
    		}ans+=min(a,b);
    		a=0;
    		b=0;
    	}
    	cout<<ans<<endl;
    }
    

    二分图的最大匹配

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,e,vis[1001],match[1001],ans;
    vector<int>z[1001];
    bool dfs(int x){
    	
    	for(int i=0;i<z[x].size();i++){
    		if(vis[z[x][i]]==0){
    			vis[z[x][i]]=1;
    			if(match[z[x][i]]==0||dfs(match[z[x][i]])){
    				match[z[x][i]]=x;
    				return true;
    			}	
    		}
    	}return false;
    }
    int main(){
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	cout.tie(0);
    	cin>>n>>m>>e;
    	for(int i=1;i<=e;i++){
    		int a,b;
    		cin>>a>>b;
    		z[a].push_back(b);
    	}for(int i=1;i<=n;i++){
    		memset(vis,0,sizeof(vis));
    		if(dfs(i))ans++;
    	}cout<<ans;
    	return 0;
    }
    
  • 最近活动

  • Stat

  • Rating