最短路径

 

1.Floyd

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define maxn 105
using namespace std;
int G[maxn][maxn],A[maxn][maxn],path[maxn][maxn]//图 最短路径 路径
int N,M;//N个点  M条路 
void floyd()
{
	memset(path,-1,sizeof(path));
    for(int i=1;i<=N;i++)    //打出最初的图 
      for(int j=1;j<=N;j++)
           A[i][j]=G[i][j];
    for(int i=1;i<=N;i++)    //任意两点间通过找出第三个点求最短距离进行更新 
       for(int j=1;j<=N;j++)
          for(int k=1;k<=N;k++)
              {
              	if(A[j][k]>A[j][i]+A[i][k])
              	     A[j][k]=A[j][i]+A[i][k];
              	     path[j][k]=i;
			  }
}

2.prime

http://acm.hdu.edu.cn/showproblem.php?pid=1102

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define max1 150
using namespace std;

int Mp[max1][max1],vis[max1],dis[max1];
int N;
bool prime(int x)
{
  for(int i=1;i<=N;i++)
     dis[i]=i==x?0:Mp[x][i];
  vis[x]=1;
  long long ans=0;
  for(int i=1;i<N;i++)
    {
    	int maxn=INF,v;
    	for(int j=1;j<=N;j++)
    	     if(!vis[j]&&maxn>dis[j])
    	        {
    	        	maxn=dis[j];
    	        	v=j;
				}
		vis[v]=1;
		ans+=maxn;
		for(int j=1;j<=N;j++)
		   if(!vis[j]&&Mp[v][j]<dis[j])
		      dis[j]=Mp[v][j];
	}
   printf("%lld\n",ans);
   return ans;
}

int main()
{   
  int m;
  int x,y;
  while(~scanf("%d",&N))
    {
    	
    	memset(vis,0,sizeof(vis));
    	for(int i=1;i<=N;i++)
    	  for(int j=1;j<=N;j++)
    	      scanf("%d",&Mp[i][j]);
    	scanf("%d",&m);
    	while(m--)
    	  {
    	  	scanf("%d %d",&x,&y);
    	  	Mp[x][y]=Mp[y][x]=0;
		  }
    prime(1);		
	}
}

3.dij

http://acm.hdu.edu.cn/showproblem.php?pid=2544

 

#include<cstdio>
#include<cstring>
const int N=105, INF=9999999;
int d[N], w[N][N],vis[N],n,m;
 
void Dijkstra(int src){
    for(int i=1; i<=n; ++i)
        d[i] = INF;
    d[src] = 0; 
    memset(vis, 0, sizeof(vis));
    for(int i=1; i<=n; ++i){
        int u=-1;
        for(int j=1; j<=n; ++j)if(!vis[j]){
            if(u==-1 || d[j]<d[u]) u=j;
        }
        vis[u] = 1;
        for(int j=1; j<=n; ++j)if(!vis[j]){
            int tmp = d[u] + w[u][j];
            if(tmp<d[j]) d[j] = tmp;
        }
    }
}
int main(){
    int a,b,c;
    while(~scanf("%d%d",&n,&m)&&n+m){
        for(int i=1; i<=n; ++i){
            w[i][i] = INF;
            for(int j=i+1; j<=n; ++j)
                w[i][j] = w[j][i] = INF;
        }
        for(int i=0; i<m; ++i){
            scanf("%d%d%d",&a,&b,&c);
            w[a][b] = w[b][a] = c;
        }
        Dijkstra(1);
        printf("%d\n", d[n]);
    }
    return 0;
}

4.Top-sort

http://acm.hdu.edu.cn/showproblem.php?pid=1285

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
bool map[517][517];
int in[517];
priority_queue<int,vector<int>,greater<int> > q;
void topo(int n)
{
    for(int i=1;i<=n;i++)
    {
        if(in[i]==0)
            q.push(i);
    }
    int c=1;
    while(!q.empty())
    {
        int v=q.top();
        q.pop();
        if(c!=n)
        {
            cout<<v<<" ";
            c++;
        }
        else
            cout<<v<<endl;
        for(int i=1;i<=n;i++)
        {
            if(!map[v][i])
                continue;
            in[i]--;
            if(!in[i])
                q.push(i);
        }
    }
}

int main()
{
    int n,m,i,j;
    while(cin>>n>>m)
    {
        int k=0;
        memset(map,0,sizeof map);
        memset(in,0,sizeof in);
        while(m--)
        {
            cin>>i>>j;
            if(map[i][j])
                continue;
            map[i][j]=1;
            in[j]++;
        }
        topo(n);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值