最短路与拓扑(2)

1、信使

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,m;
int g[N][N];
int dist[N];
bool st[N];
const int INF=0x3f3f3f3f;

int dij(){
    memset(dist,0x3f,sizeof dist);
    dist[1]=0;
    
    for(int i=1;i<n;i++){
        int t=0;
        for(int j=1;j<=n;j++){
            if(!st[j]&&dist[j]<dist[t]){
                t=j;
            }
        }
        st[t]=true;
        
        for(int k=1;k<=n;k++){
            dist[k]=min(dist[k],dist[t]+g[t][k]);
        }
    }
    
    int res=0;
    for(int i=1;i<=n;i++){
        if(dist[i]==INF) return -1;
        res=max(res,dist[i]);
    }
    return res;
}

int main(){
    cin>>n>>m;
    memset(g,0x3f,sizeof g);
    
    for(int i=1;i<=n;i++){
        g[i][i]=0;
    }
    
    for(int i=0;i<m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        g[u][v]=min(g[u][v],w);
        g[v][u]=min(g[v][u],w);
    } 
    
    cout<<dij()<<endl;
    return 0;
}

2、最小花费

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
double g[N][N];
double dist[N];
bool st[N];
int n,m,A,B;
void dij(){
	memset(st, 0, sizeof st);
	st[N]={0.0};
	dist[A]=1.0;
	for(int i=1;i<=n;i++){
		int t=-1;
		for(int j=1;j<=n;j++){
			if(!st[j]&&(t==-1||dist[j]>dist[t])){
				t=j;
			}
		}
		if(t==0)continue;
		st[t]=true;
		
		for(int k=1;k<=n;k++){
			if(g[t][k]>0){
				dist[k]=max(dist[k],dist[t]*g[t][k]);
			}	
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			g[i][j]=0;
		}
	}
	for(int i=1;i<=n;i++){
		int u,v,w;
		cin>>u>>v>>w;
		double r=(100.0-w)/100.0;
		g[u][v]=max(g[u][v],r);
		g[v][u]=max(g[u][v],r);
	}
	cin>>A>>B;
	dij();
	cout<<fixed<<setprecision(8)<<100.0/dist[B]<<endl;
	return 0;
}

3、Dijkstra算法(模板)

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2505;
int g[N][N];
int dis[N];
bool vis[N];
int n, m, s, t;
const int INF=1e9+10;

void dij(int start, int end) {
    // 初始化距离数组
    for(int i=1; i<=n; i++) {
        dis[i] = INF;
        vis[i] = false;
    }
    dis[start] = 0;
    
    for(int i=1; i<=n; i++) {
        int u = -1, min_dist = INF;
        // 寻找未访问节点中距离最小的节点
        for(int j=1; j<=n; j++) {
            if(!vis[j] && dis[j] < min_dist) {
                min_dist = dis[j];
                u = j;
            }
        }
        
        if(u == -1) break; // 所有可达节点都已处理
        vis[u] = true; // 标记节点为已访问
        
        // 更新邻接节点的距离
        for(int v=1; v<=n; v++) {
            if(!vis[v] && g[u][v] != INF && dis[u] + g[u][v] < dis[v]) {
                dis[v] = dis[u] + g[u][v];
            }
        }
    }
}

int main() {
    cin >> n >> m >> s >> t;
    
    // 初始化邻接矩阵
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++) {
            if(i == j) g[i][j] = 0;
            else g[i][j] = INF; // 无边的情况初始化为INF
        }
    }
    
    // 读取边
    for(int i=1; i<=m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        // 处理重边,取最小值
        g[u][v] = min(g[u][v], w);
        g[v][u] = min(g[v][u], w);
    }
    
    dij(s, t);
    cout << dis[t] << endl; // 输出最短路径
    
    return 0;
}

4、排列论文

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=105;
vector<int>g[N];
int a[N];
int n,m;
int flag;
int topSort(){
	queue<int>q;
	for(int i=1;i<=n;i++){
		if(a[i]==0){
			q.push(i);
		}
	}
	int cnt=0;//记录拓扑排序的排点数
	flag=1;
	while(!q.empty()){
		int t=q.front();
		q.pop();
		cnt++;
		if(!q.empty())flag=2;
		
		for(int i=0;i<g[t].size();i++){
			int x=g[t][i];
			a[x]--;
			if(a[x]==0)q.push(x);
		}
	}
	if(cnt<n)flag=0;
	return flag; 
}
int main() {
    while(cin>>n>>m){
    	for(int i=1;i<=n;i++){//初始化 
    		g[i].clear();//每一个点清空 
    		a[i]=0;
		}
		for(int i=1;i<=m;i++){
			int u,v;
			cin>>u>>v;
			a[v]++;//更新入度 
			g[u].push_back(v);
		}
		int ff=topSort();
		if(ff==0)cout<<"0\n";
		else if(ff==1)cout<<"1\n";
		else if(ff==2)cout<<"2\n";
	}
    return 0;
}
相关推荐
2301_803554529 分钟前
c++和c的不同
java·c语言·c++
Darkwanderor11 分钟前
c++STL-通用(反向)迭代器适配器
c++
fie888912 分钟前
用模型预测控制算法实现对电机位置控制仿真
算法
Kent_J_Truman15 分钟前
【交互 / 差分约束】
算法
清幽竹客17 分钟前
redis数据结构-02(INCR、DECR、APPEND)
数据结构·redis
Akiiiira18 分钟前
【数据结构】线性表
数据结构
ghie909021 分钟前
x-IMU matlab zupt惯性室内定位算法
人工智能·算法·matlab
Magnum Lehar30 分钟前
3d游戏引擎的Utilities模块实现
c++·算法·游戏引擎
小狗祈祷诗32 分钟前
day20-线性表(链表II)
c语言·数据结构·链表
普通的冒险者1 小时前
几个简单的数组小练习(适合初学)
java·数据结构