zoukankan      html  css  js  c++  java
  • 最短路HDU1874通工程续

    中文题。裸裸的最短路,练习各种模板。

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874

    Floyd

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <string>
    #include <iostream>
    using namespace std;
    const int INF=0xfffffff;
    int n;
    int dp[1111][11111];
    void fly()
    {
    	for(int k=0;k<n;k++)
    	for(int i=0;i<n;i++){
    		for(int j=0;j<n;j++){
    			if(dp[i][j]>dp[i][k]+dp[k][j])
    				dp[i][j]=dp[i][k]+dp[k][j];
    		}
    	}
    }
    
    int main()
    {
    	int m;
    	while(scanf("%d%d",&n,&m)!=EOF){
    		for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++){
    			if(i==j)
    				dp[i][j]=0;
    			else
    				dp[i][j]=INF;
    		}
    		for(int i=0;i<m;i++){
    			int a,b,c;
    			scanf("%d%d%d",&a,&b,&c);
    			if(dp[a][b]>c)
    				dp[a][b]=dp[b][a]=c;
    		}
    		fly(); int s;int e;
    		scanf("%d%d",&s,&e);
    		if(dp[s][e]==INF)
    			printf("-1
    ");
    		else
    			printf("%d
    ",dp[s][e]);
    
    	}
    	return 0;
    }
    

    Djs+优先队列+邻接表

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <string>
    #include <iostream>
    using namespace std;
    const int INF=0xfffffff;
    struct edge
    {
    	int val;int next;int to;
    }e[1111111];
    
    int len;int head[111111];
    
    void add(int from ,int to,int val)
    {
    	e[len].to=to;
    	e[len].val=val;
    	e[len].next=head[from];
    	head[from]=len++;
    }
    
    struct Node
    {
    	int x;int dist;
    };
    
    struct cmp
    {
    	bool operator() (const Node &a,const Node & b)
    	{
    		return a.dist>b.dist;
    	}
    };
    
    int n;
    int dis[1000];
    int vis[1000];
    void djs(int x)
    {
    	for(int i=0;i<n;i++)
    		dis[i]=INF;
    	memset(vis,0,sizeof(vis));
    	dis[x]=0;
    	Node k;k.x=x;k.dist=0;
    	priority_queue<Node,vector<Node>,cmp> q;
    	q.push(k);
    	while(!q.empty()){
    		int cur=q.top().x;
    		q.pop();
    		if(vis[cur]) continue;
    		vis[cur]=1;
    		for(int i=head[cur];i!=-1;i=e[i].next){
    			int cc=e[i].to;
    			if(!vis[cc]&&dis[cur]+e[i].val<dis[cc]){
    				dis[cc]=dis[cur]+e[i].val;
    				Node k;k.x=cc;k.dist=dis[cc];
    				q.push(k);
    			}
    		}
    	}
    }
    int main()
    {
    	int m,a,b,c,e,s;
    	while(scanf("%d%d",&n,&m)!=EOF){
    		len=0;memset(head,-1,sizeof(head));
    		for(int i=0;i<m;i++){
    			scanf("%d%d%d",&a,&b,&c);
    			add(a,b,c);
    			add(b,a,c);
    		}
    		scanf("%d%d",&s,&e);
    		djs(s);
    		if(dis[e]==INF){
    			printf("-1
    ");
    		}
    		else
    			printf("%d
    ",dis[e]);
    	}
    	return 0;
    }
    

    spfa+邻接表

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <map>
    #include <string>
    #include <iostream>
    using namespace std;
    const int INF=0xffffff;
    struct edge
    {
    	int val;int next;int to;
    }e[111111];
    
    int len;int head[10000];
    void add(int from,int to,int val)
    {
    	e[len].to=to;
    	e[len].val=val;
    	e[len].next=head[from];
    	head[from]=len++;
    }
    int dis[111111];
    int vis[111111];
    int n;
    void spfa(int x)
    {
    	for(int i=0;i<n;i++)
    		dis[i]=INF;
    	memset(vis,0,sizeof(vis));
    	dis[x]=0;vis[x]=1;
    	queue<int> q;
    	q.push(x);
    	while(!q.empty()){
    		int cur=q.front();
    		q.pop();
    		vis[cur]=0;
    		for(int i=head[cur];i!=-1;i=e[i].next){
    			int cc=e[i].to;
    			if(dis[cc]>dis[cur]+e[i].val){
    				dis[cc]=dis[cur]+e[i].val;
    				if(!vis[cc]){
    					vis[cc]=1;
    					q.push(cc);
    				}
    			}
    		}
    	}
    }
    
    int main()
    {
    	int m,a,b,c,s,e;
    	while(scanf("%d%d",&n,&m)!=EOF){
    		len=0;memset(head,-1,sizeof(head));
    		for(int i=0;i<m;i++){
    			scanf("%d%d%d",&a,&b,&c);
    			add(a,b,c);
    			add(b,a,c);
    		}
    		scanf("%d%d",&s,&e);
    		spfa(s);
    		if(dis[e]==INF)
    			printf("-1
    ");
    		else
    			printf("%d
    ",dis[e]);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    fern没有扫描到任何ap
    kali软件的必须知道的那些事
    我的kali学习计划
    arping 自己
    kali密码破解
    kali目录修改
    我的电脑网络不通了
    收藏链接的正确方法
    maltego的 卡 慢 没反应 的问题解决方法
    git报错 failed: The TLS connection was non-properly terminated.
  • 原文地址:https://www.cnblogs.com/yigexigua/p/3759174.html
Copyright © 2011-2022 走看看