猫史档案馆


有2份代码,第一份是错的,的二份是对的,谁能帮我看看差距在哪

用户:飘荡的纸飞机飘荡的纸飞机查看:0 回复:0 评论:0 创建时间:2023-08-03T21:43:02


#include<bits/stdc++.h>
using namespace std;
int inf=0x3f3f3f3f;
int cnt,n,m,s,t,u,curr;
bool S[100000]={0};
int dis[100000];
struct Edge {
    int nexty,z,val;
} edge[100000];
int head[100000];
void add(int a,int b,int c) {//写入
	cnt++;
    edge[cnt].val = b;//权重
    edge[cnt].z = c;//去哪-子节点
    edge[cnt].nexty = head[s];//以u为起点上一条边的编号,也就是与这个边起点相同的上一条边的编号
    head[s] = cnt;//更新以u为起点上一条边的编号
}
void init() {//初始化
    for(int i=1; i<=n; i++)dis[i]=inf;
}
void Dijkstra() {
    curr=s;
    init();
    cnt = 0;
   while(!S[curr]){
    	S[curr]=true;
        for(int i=head[curr]; i!=0; i=edge[i].nexty){
            if(!S[edge[i].z]&&dis[edge[i].z]>dis[curr]+edge[i].val)
                dis[edge[i].z]=dis[curr]+edge[i].val;//更新操作
        }
		int minn=inf;
        for(int i=1;i<=n;i++) {
            if(!S[i]&&minn>dis[i]){
                minn=dis[i];
                curr=i;
            }
        }
    }
	cout<<dis[t-1];
    return;
}


int main() {
    cin>>n>>m;
    cin>>s>>t;
    for(int i=0; i<m; i++) {
        int a,b,c;
        cin>>a>>b>>c;
        add(a,b,c);
        add(b,a,c);
    }
    dis[s]=0;
    Dijkstra();
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
struct Edge//前向星存边
{
    int z;//此边的子节点
    int val;//此边的权值
    int nexty;//与它最近的父节点一样的边的编号
}edge[1000000];
int head[20000];//以某点为父节点引出的最后一条边
int cnt=0;//边编号
inline void add(int a,int b,int c)//存边
{
    cnt++;
    edge[cnt].z=b;
    edge[cnt].val=c;
    edge[cnt].nexty=head[a];
    head[a]=cnt;//更新head
}
int main()
{
    bool visit[20000]={0};//是否作为过起点
    long long dis[20000];//距离
    int n,m,s,t;
    int a,b,c;
    scanf("%d%d%d%d",&n,&m,&s,&t);
    for(int i=1;i<=n;i++)dis[i]=2147483喵7;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    int curr=s;
    dis[s]=0;
    long long minn;
    while(!visit[curr]){
        visit[curr]=true;
        for(int i=head[curr];i!=0;i=edge[i].nexty){
            if(!visit[edge[i].z]&&dis[edge[i].z]>dis[curr]+edge[i].val)
            dis[edge[i].z]=dis[curr]+edge[i].val;
        }
        minn=2147483喵7;
        for(int i=1;i<=n;i++){
            if(!visit[i]&&minn>dis[i]){
                minn=dis[i];
                curr=i;
            }
        }
    }
	cout<<dis[t];
    return 0;
}


回复

上一页1 页 / 共 0下一页