2 条题解

  • 0
    @ 2025-7-4 15:15:48

    2.Dijkstra(23ms/640KiB)2.Dijkstra(23ms/640 KiB)

    #include<bits/stdc++.h>
    using namespace std;
    const int N=205;
    int p;
    
    struct edge{
    	int to;
    	int next;
    	int val;
    }a[20005];
    int head[N],cnt;
    void add_edge(int u,int v,int w){
    	if(u==v) return;//每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)
    //可以不管重边,dijkstra会解决
    	a[++cnt].to=v;
    	a[cnt].val=w;
    	a[cnt].next=head[u];
    	head[u]=cnt;
    	return; //链式前向星存图
    }
    int dis[N];
    bool vis[N];
    struct node{
    	int now;
    	int w;
    	bool operator < (const node &S) const {
    		return w>S.w;
    	}
    };
    priority_queue<node>Q;
    void dijkstra(int start){//模板
    	for(int i=0;i<=55;i++) dis[i]=1e9;
    	dis[start]=0;
    	Q.push({start,0});
    	while(!Q.empty()){
    		int t=Q.top().now;
    		Q.pop();
    		if(vis[t]) continue;
    		vis[t]=1; 
    		for(int i=head[t];i;i=a[i].next){
    			int to=a[i].to;
    			if(dis[to]>dis[t]+a[i].val){
    				dis[to]=dis[t]+a[i].val;
    				if(!vis[to]) Q.push({to,dis[to]});
    			}
    		}
    	}
    	return;
    }
    
    int num(char ch){
    	if('a'<=ch&&ch<='z') return ch-'a'+26;
    	return ch-'A';
    }
    signed main(){
    	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    	cin>>p;
    	for(int i=1;i<=p;i++){
    		char ch,ch2;int c;
    		cin>>ch>>ch2>>c;
    		
    		int a=num(ch),b=num(ch2);
    		
    		add_edge(a,b,c);add_edge(b,a,c);//建边
    	}
    	
    	dijkstra(25);
    	
    	int mi=1e9,mii=0;
    	for(int i=0;i<=24;i++){
    		if(dis[i]<mi){
    			mi=dis[i];
    			mii=i;
    		}
    	}//同理
    	cout<<char(mii+'A')<<' '<<mi;
    	return 0;
    }
    
    • 0
      @ 2025-7-4 14:49:14

      1.Floyd(53ms/512KiB)1.Floyd(53ms/512 KiB)

      #include<bits/stdc++.h>
      using namespace std;
      const int N=205;
      int p;
      int dp[N][N];
      int num(char ch){
      	if('a'<=ch&&ch<='z') return ch-'a'+26;
      	return ch-'A';
      }
      signed main(){
      	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
      	cin>>p;
      	for(int i=0;i<=55;i++){
      		for(int j=0;j<=55;j++){
      			dp[i][j]=1e9;
      		}
      	}//求最小值,所以初始化为很大的数
      	for(int i=1;i<=p;i++){
      		char ch,ch2;int c;
      		cin>>ch>>ch2>>c;
      		
      		int a=num(ch),b=num(ch2);
      		//转成数
      		dp[a][b]=dp[b][a]=min(dp[a][b],c);
      //重边取最小值,因为尽量要走短的路
      	}
      	
      	for(int k=0;k<=55;k++){
      		for(int i=0;i<=55;i++){
      			for(int j=0;j<=55;j++){//Floyd求最短路
      				dp[i][j]=min(dp[i][k]+dp[k][j],dp[i][j]);
      			}
      		}
      	}
      	int mi=1e9,mii=0;
      	for(int i=0;i<=24;i++){
      		if(dp[i][25]<mi){//dp[i][25]为第 i 个牧场的奶牛到谷场的距离
      			mi=dp[i][25];
      			mii=i;//取最小值并记录
      		}
      	}
      	cout<<char(mii+'A')<<' '<<mi;
      //转成奶牛编号(字符)并输出奶牛编号和最短路径
      	return 0;
      }
      
      • 1

      信息

      ID
      293
      时间
      1000ms
      内存
      256MiB
      难度
      4
      标签
      (无)
      递交数
      93
      已通过
      41
      上传者