随笔- 181  文章- 2  评论- 0  阅读- 6773 

Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。

Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间


输入样例

2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
 

输出样例

3
2
附带ac代码
复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=1e4+10,INF=0x3f3f3f3f;
int head[M],dist[N],cnt,vis[N];
struct _edge{
    int to,dis,next;
}edge[M];
struct node{
    int id,dis;
    friend bool operator < (const node T1,const node T2)
    {
        return T1.dis>T2.dis;
    }
};
void add_edge(int from,int to,int dis)
{
    edge[++cnt].to=to;
    edge[cnt].dis=dis;
    edge[cnt].next=head[from];
    head[from]=cnt;
}
void dij(int n)
{
    priority_queue<node> q;
    q.push(node{1,0});
    while(!q.empty())
    {
        node a=q.top();q.pop();
        int now=a.id;
        if(vis[now]) continue;
        vis[now]=1;
        for(int i=head[now];i;i=edge[i].next)
        {
            int j=edge[i].to;
            if(dist[now]+edge[i].dis<dist[j])
            {
                dist[j]=dist[now]+edge[i].dis;
                q.push(node {j,dist[j]});
            }
        }
    }
}
int main()
{
    int n,m,a,b,c;
    while(scanf("%d%d",&n,&m)==2,n)
    {
        for(int i=2;i<=n;++i)
            dist[i]=INF;
        dist[1]=0;
        cnt=0;
        memset(edge,0,sizeof(edge));
        memset(head,0,sizeof(head));
        memset(vis,0,sizeof(vis));
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&c);
            add_edge(a,b,c);
            add_edge(b,a,c);//注意是双向图
        }
        dij(n);
        printf("%d\n",dist[n]);
    }
}
复制代码

 edge可以不memset

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=110,M=1e4+100;
const int INF=0x3f3f3f3f;
struct node{
    int id,dis;
    bool operator < (const node& t) const
    {
        return t.dis<dis;
    }
    // friend bool operator < (const node T1,const node T2)
    // {
    //     return T1.dis>T2.dis;
    // }
};
struct _edge{
    int to,val,next;
}edge[M];
int cnt;
int head[M],dist[N],vis[N];
void merge(int from,int to,int val)
{   
    edge[++cnt].to=to;
    edge[cnt].val=val;
    edge[cnt].next=head[from];
    head[from]=cnt;
}
void dij()
{
    priority_queue<node> q;
    q.push(node {1,0});
    while(!q.empty())
    {
        node a=q.top();q.pop();
        int now=a.id;
        //cout<<"----"<<now<<endl;
        if(vis[now]) continue;
        vis[now]=1;
        for(int i=head[now];i;i=edge[i].next)
        {
            int j=edge[i].to;
            if(dist[now]+edge[i].val<dist[j])
            {dist[j]=dist[now]+edge[i].val;
            q.push(node {j,dist[j]});
            }
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n,m;
    int a,b,c;
    while(cin>>n>>m,n!=0||m!=0)
    {
        // memset(dist,0x3f,sizeof(dist));
        for(int i=2;i<=n;++i) dist[i]=INF;
        memset(head,0,sizeof(head));
        //memset(edge,0,sizeof(edge));
        memset(vis,0,sizeof(vis));
        dist[1]=0;cnt=0;
        for(int i=0;i<m;++i)
        {cin>>a>>b>>c;merge(a,b,c);merge(b,a,c);
        }
        dij();
        cout<<dist[n]<<'\n';
    }
    return 0;
}
复制代码

 

 
 posted on   ruoye123456  阅读(33)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示