3 solutions

  • 3
    @ 2024-5-8 14:00:17

    #P4779. 【模板】单源最短路径(标准版)题解)的代码复制过来,然后把入队条件和输出改改就行了

    代码

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 2005,M = 4022035;	// 改这里
    
    // 链式前向星 
    struct edge{
    	int v,w,prev;
    }edges[M];
    int tail[N],tot;
    void add_edge(int u,int v,int w){
    	edges[++tot] = {v,w,tail[u]};
    	tail[u] = tot;
    }
    
    int n,m,s,e;
    double dis[N];
    bool f[N];
    void dkstr(){
    	priority_queue<pair<double,int>> q;
    	q.push({-100,s});
    	while (!q.empty()){
    		int u = q.top().second;
    		q.pop();
    		if (f[u])	continue;
    		f[u] = 1;
    		for (int i = tail[u];i;i = edges[i].prev){
    			int v = edges[i].v,w = edges[i].w;
    			// 改这里
    			if (!f[v] && dis[u] / (1 - w / 100.0) < dis[v]){
    				dis[v] = dis[u] / (1 - w / 100.0);
    				q.push({-dis[v],v});
    			}
    		}
    	}
    }
    int main(int argc, char **argv){
    	memset(dis,0x7f,sizeof(dis));
    
    	cin >> n >> m;
    	for (int i = 0;i < m;i++){
    		int u,v,w;
    		cin >> u >> v >> w;
    		add_edge(u,v,w);
    		add_edge(v,u,w);
    	}
    	cin >> s >> e;
    	dis[s] = 100;
    
    	dkstr();
    	printf("%.8lf",dis[e]);	// 改这里
    	return 0;
    }
    
    • 3
      @ 2024-5-8 13:58:46

      题解

      求一个点到另一个点的最小花费

      思路

      将最短路的更新部分改一改就可以了

      注意M的值开大点

      代码

      #include<iostream>
      #include<queue>
      #include<cstring>
      #include<utility>
      #define N 11451
      #define M 4514114//开大点
      #define INF 0x3ffffffff
      using namespace std;
      int n,m,a,b;
      struct ed
      {
          int u,v,w;
          int next;
      };
      ed g[M];
      int to=0,h[N];
      double dis[N]={0};
      int vis[N]={0};
      priority_queue<pair<double,int> ,vector<pair<double,int> >,greater<pair<double,int> > >q;
      void dijkstra()
      {
          while(!q.empty())
          {
              int u=q.top().second;
              q.pop();
              if(vis[u])
                  continue;
              vis[u]=1;
              for(int i=h[u];i;i=g[i].next)
              {
                  int v=g[i].v;
                  double l=dis[u]/(1-g[i].w*0.01);//注意公式
                  if(l<dis[v] && !vis[v])
                  {
                      dis[v]=l;
                      q.push({l,v});
                  }
              }
          }
      }
      void push(int u,int v,int w)
      {
          g[++to]={u,v,w};
          g[to].next=h[u];
          h[u]=to;
      }
      int main()
      {
          cin>>n>>m;
          for(int i=0;i<m;i++)
          {
              int u,v,w;
              cin>>u>>v>>w;
              push(u,v,w);
              push(v,u,w);//双向
          }
          cin>>a>>b;
          memset(dis,0x7f,sizeof(dis));
          dis[a]=100;
          q.push({100,a});
          dijkstra();
          printf("%.8lf",dis[b]);//输出
          return 0;//完结散花
      }
      
      • @ 2024-5-8 16:48:43

        感觉和hmz的思路一样

      • @ 2024-5-9 12:50:42

        这个题目确实是这样做的,我可没有抄袭哟,不信你看提交记录@

      • @ 2024-5-9 12:51:53

        是我先AC的@

      • @ 2024-5-9 12:53:09

        准确说是hmz借鉴我的(他做的时候他还叫我看我的代码)@

    • 0
      @ 2024-4-27 16:44:39
      #include <bits/stdc++.h>
      
      using namespace std;
      const int maxn = 2e3 + 5, INF = 0x3f3f3f3f;
      int n, m, s, a ,b;
      struct node{
      	int v;
      	double w;
      };
      vector<node> g[maxn];
      priority_queue<pair<double, int>> q;
      double dis[maxn];
      bool vis[maxn];
      void dj(int s){
      	memset(dis, 0, sizeof(dis));
      	memset(vis, 0, sizeof(vis));
      	dis[s] = 1;
      	q.push(make_pair(0, s));
      	while (!q.empty()){
      		int u = q.top().second;
      		q.pop();
      		if (vis[u]) continue;
      		vis[u] = true;
      		for (auto p : g[u]){
      			if (dis[u] * p.w > dis[p.v]){
      				dis[p.v] = dis[u] * p.w;
      				q.push(make_pair(dis[p.v], p.v));
      			}
      		}
      	}
      }
      int main(){
      	cin >> n >> m;
      	for (int i = 1; i <= m; i++){
      		int u, v;
      		double w;
      		cin >> u >> v >> w;
      		g[u].push_back({v,1 -  w / 100});
      		g[v].push_back({u,1 -  w / 100});
      	}
      	cin >> a >> b;
      	dj(b);
      	cout << fixed << setprecision(8) << (double)(100 / dis[a]) << endl; 
      	return 0;
      }
      
      • 1

      Information

      ID
      829
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      7
      Tags
      # Submissions
      65
      Accepted
      14
      Uploaded By