1 solutions

  • 0
    @ 2025-3-3 16:24:10

    C++ :

    #include<cstdio>
    #include<algorithm>
    #define MAXN 99999999
    using namespace std;
    int dis[100],tu[100][100];//从z出发的dis值和邻接矩阵
    int p,vis[100];//道路数目、节点标记
    char r;
    void di(int x,int y,int w)//存图
    {
    	
        if(tu[x][y]==0)//读入边
        
    	{
    		tu[x][y]=w;
    		tu[y][x]=w;
            
    	}
    	if(w<tu[x][y])//读入的第二条边比第一条边的权值小,就替换
    	{
    		tu[x][y]=w; 
    		tu[y][x]=w;
    	}
    } 
    void dj()//迪杰斯特拉裸代码(好像是啊哈算法上面的??)
    {
    
    	int u,min;
        
    	for(int i=1;i<=51;i++)
    	{
    		min=MAXN;
    		for(int j=1;j<=51;j++)
    		{
    			if(vis[j]==0&&dis[j]<min)
    			{
    				min=dis[j];
    				u=j;
    			}
    		}
    		vis[u]=1;
    		for(int v=1;v<=51;v++)
    		{
    			if(dis[v]>dis[u]+tu[u][v]&&vis[v]==0&&tu[u][v]<MAXN)
    			dis[v]=dis[u]+tu[u][v];
    		}
    	}
    }
    int main()
    {
    
    	scanf("%d",&p);
        
    	for(int i=1;i<=52;i++)
    		for(int j=1;j<=51;j++)
    			tu[i][j]=MAXN;
    	vis[52]=1;//因为'Z'存图的时候是52,所以打上标记
    	for(int i=1;i<=p;i++)//借鉴楼上的读入
    	{
    		char x,y;//两个点
    		int c;//权值
    		int xx,yy;
    		scanf("\n%c %c %d",&x,&y,&c);
    		if(x>='a'&&x<='z') xx=x-'a'+1;
    		else xx=x-'A'+27;
    		if(y>='a'&&y<='z') yy=y-'a'+1;
    		else yy=y-'A'+27;
    		di(xx,yy,c);
    	}
    	for(int i=1;i<=51;i++)
    	dis[i]=tu[52][i];
    	dj();int hh=MAXN,point;
    	for(int i=1;i<=51;i++)//判断大写并输出
    	{
    		if(dis[i]<hh&&i>=27)
    		{
    			hh=dis[i];
    			point =i;
    		}
    	}
    	r=point-27+'A';
    	printf("%c %d\n",r,hh);
    } 
    
    • 1

    Information

    ID
    10033
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By