• 静态邻接表的简单实现


    静态:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    using namespace std;
    #pragma warning(disable : 4996)
    const int MAXN = 1005;
    
    typedef struct Node 
    {
    	int v;
    	int next;
    }Node;
    Node edge[MAXN];
    int first[MAXN];
    int n, m; //n点数 m边数
    
    void init()
    {
    	int x, y;
    	memset(first, -1, sizeof(first));
    	for (int i = 1; i <= m; i++)
    	{
    		cin >> x >> y;
    		edge[i].next = first[x];
    		edge[i].v = y;
    		first[x] = i;
    	}
    }
    
    void print()
    {
    	for (int i = 1; i <= n; i++)
    	{
    		printf("%d", i);
    		for (int j = first[i]; j != -1; j = edge[j].next)
    		{
    			printf("->%d", edge[j].v);
    		}
    		printf("\n");
    	}
    }
    
    int main()
    {
    	while (scanf("%d %d", &n, &m) != EOF)
    	{
    		init();
    		print();
    	}
    	return 0;
    }

    对于重边选取value小的值:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #include <algorithm>
    using namespace std;
    #pragma warning(disable : 4996)
    const int MAXN = 1005;
    
    typedef struct Node 
    {
    	int v;//终点位置
    	int value;//权值
    	int next;//同一起点下在edge数组中的位置
    }Node;
    Node edge[MAXN];//邻接表
    int first[MAXN];//以该点为起点的第一条边在edge数组中的位置
    int n, m; //n点数 m边数
    
    void init()
    {
    	int x, y, value, index;
    	bool flag;
    	memset(first, -1, sizeof(first));
    	index = 1;
    	for (int i = 1; i <= m; i++)
    	{
    		scanf("%d %d %d", &x, &y, &value);
    		flag = false;
    		for (int j = first[x]; j != -1; j = edge[j].next)
    		{
    			if(y == edge[j].v)
    			{
    				if(value < edge[j].value)
    				{
    					edge[j].value = value;
    				}
    				flag = true;
    				break;
    			}
    		}
    		if(flag)
    		{
    			continue;
    		}
    		edge[index].v = y;
    		edge[index].value = value;
    		edge[index].next = first[x];
    		first[x] = index++;
    
    		swap(x, y);
    		edge[index].v = y;
    		edge[index].value = value;
    		edge[index].next = first[x];
    		first[x] = index++;
    	}
    }
    
    void print()
    {
    	for (int i = 1; i <= n; i++)
    	{
    		printf("%d", i);
    		for (int j = first[i]; j != -1; j = edge[j].next)
    		{
    			printf("->%d", edge[j].v);
    		}
    		printf("\n");
    	}
    }
    
    int main()
    {
    	while (scanf("%d %d", &n, &m) != EOF)
    	{
    		if(n == 0 && m == 0)
    		{
    			break;
    		}
    		init();
    		print();
    	}
    	return 0;
    }

    可见邻接表与邻接矩阵相比,还是麻烦不少,但在稀疏图,邻接表的威力就显现出来了,毕竟只储存非零节点。

    最短路

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 19979    Accepted Submission(s): 8541


    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
    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
     

    Sample Input
    2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
     

    Sample Output
    3 2

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #include <algorithm>
    using namespace std;
    #pragma warning(disable : 4996)
    const int MAXN = 105;
    const int INF = 999999;
    
    typedef struct Node 
    {
    	int v;//终点位置
    	int value;//权值
    	int next;//同一起点下在edge数组中的位置
    }Node;
    Node edge[10005];//邻接表
    int first[MAXN];//以该点为起点的第一条边在edge数组中的位置
    int n, m; //n点数 m边数
    bool visited[MAXN];
    int dist[MAXN];
    queue<int>Q;
    
    void init()
    {
    	int x, y, value, index;
    	bool flag;
    	memset(first, -1, sizeof(first));
    	index = 1;
    	for (int i = 1; i <= m; i++)
    	{
    		scanf("%d %d %d", &x, &y, &value);
    		flag = false;
    		for (int j = first[x]; j != -1; j = edge[j].next)
    		{
    			if(y == edge[j].v)
    			{
    				if(value < edge[j].value)
    				{
    					edge[j].value = value;
    				}
    				flag = true;
    				break;
    			}
    		}
    		if(flag)
    		{
    			continue;
    		}
    		edge[index].v = y;
    		edge[index].value = value;
    		edge[index].next = first[x];
    		first[x] = index++;
    
    		swap(x, y);
    		edge[index].v = y;
    		edge[index].value = value;
    		edge[index].next = first[x];
    		first[x] = index++;
    	}
    }
    
    
    void SPFA(int Start)
    {
    	while (!Q.empty())
    	{
    		Q.pop();
    	}
    	memset(visited, false, sizeof(visited));
    	for (int i = 1; i <= n; i++)
    	{
    		dist[i] = INF;
    	}
    	dist[Start] = 0;
    	visited[Start] = true;
    	Q.push(Start);
    	while (!Q.empty())
    	{
    		int top = Q.front();
    		Q.pop();
    		visited[top] = false;
    		for (int i = first[top]; i != -1 ; i = edge[i].next)
    		{
    			int e = edge[i].v;
    			if(dist[e] > edge[i].value + dist[top])
    			{
    				dist[e] = edge[i].value + dist[top];
    				if(!visited[e])
    				{
    					Q.push(e);
    					visited[e] = true;
    				}
    			}
    		}
    	}
    }
    
    int main()
    {
    	freopen("in.txt", "r", stdin);
    	while (scanf("%d %d", &n, &m) != EOF)
    	{
    		if(n == 0 && m == 0)
    		{
    			break;
    		}
    		init();
    		SPFA(1);
    		printf("%d\n", dist[n]);
    	}
    	return 0;
    }



  • 相关阅读:
    Java的常量接口思考,项目中的常量是放在接口里还是放在类里呢?
    有些时候会看到url参数上出现%BF之类
    mysql 取整
    MySQL使用判断
    java 获得当前时间前指定几个小时的时间?
    SVN集成compare4比较软件
    JAVA去重
    连接SQL常见问题
    springMVC项目部署 服务器启动spring容器报错bean未从类加载器中找到
    Java 中Timer和TimerTask 定时器和定时任务使用的例子
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835039.html
Copyright © 2020-2023  润新知