2 条题解

  • 0
    @ 2023-12-16 14:15:36
    #include<bits/stdc++.h>
    using namespace std;
    long long n,m,x,y,z,f[50000],b[205][205];
    int main()
    {
      int i,j;
      cin>>n>>m;
      for(i=1;i<=200;++i)
      for(j=1;j<=200;++j)
      b[i][j]=1000000000000000;
      for(i=1;i<=m;++i)
      {
      	cin>>x>>y>>z;
      	b[x][y]=min(b[x][y],z);
      }
      for(i=n;i>=1;i--)
      {
      	for(j=1;j<=n;j++)
      	{
      	  if(f[i]>b[i][j]+f[j]&&b[i][j])//在两个点中插入一个点,使这两个点的距离通过新点变小
      	  {
      	  	f[i]=f[j]+b[i][j];
    	  }
    	}
      }
      cout<<f[1];
      return 0;
    }
    
    • 0
      @ 2022-7-25 10:32:15
      #pragma GCC optimize(3,"Ofast","inline")
      #include<bits/stdc++.h>
      using namespace std;
      long x,z,y,i,n,m,a[1005][1005],f[1005],j,b[1005][1005];
      long read()//快读
      {
      	long x=0,f=1;
      	char ch=getchar();
      	while(ch<'0'||ch>'9'){
      		if(ch=='-')f=-1;
      		ch=getchar();
      	}
      	while(ch>='0'&&ch<='9')
      	{
      		x=x*10+(ch-'0');
      		ch=getchar();
      	}
      	return x*f;
      }
      void write(long x) {//快输
      	if(x<0){
      		putchar('-');
      		write(-x);
      		return;
      	}
      	if(x>=10)write(x/10);
      	putchar(x%10+'0');
      }
      int main()
      {
      	n=read(),m=read();
      	while(m--)
      	{
      		x=read();
      		y=read();
      		z=read();
      		if(!b[x][y])a[x][y]=z;
      		else a[x][y]=min(a[x][y],z);//有重复时找最大
      		b[x][y]=1;
      	}
      	for(i=1;i<n;i++)f[i]=1e9;
      	f[n]=0;//初始值
      	for(i=n-1;i>=1;i--)
      		for(j=i+1;j<=n;j++)
      			if(a[i][j])f[i]=min(f[i],f[j]+a[i][j]);//如果连通,就找最短路径
      	write(f[1]);
      	return 0;
      }```
      • 1

      信息

      ID
      26
      时间
      1000ms
      内存
      256MiB
      难度
      6
      标签
      (无)
      递交数
      155
      已通过
      52
      上传者