POJ - 2387 Til the Cows Come Home (dijkstra模板题)

题目大意

这道题要我们求一群奶牛最短的回家的路,题目会给你n个点,m条边,然后给你每条边又哪两个点相连,并且其中的路程是多少。我们需要找到最短路径的总路程。

样例输入

5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100

样例输出

90

分析

坑点1:这边和点是倒着给的 , 你需要先输入边再输入点。
坑点2:他会给你重复的边,比如1和2之间的距离是100,然后又给你说1和2之间的距离是80。当然我们可以理解为1和2之间有两条路,但是我就因为这个wa了好多发。当然,我们构建邻接矩阵的时候需要选择最短的那条路。

剩下的就dijkstra一波带走。代码如下。

#include
#include
#include
#include
#include
#define CLR(x) memset(x,0,sizeof(x))
using namespace std;
const int INF = 100000;
const int maxp = 1100;
const int maxl = 1000000;
int edge[maxp][maxp];
int dist[maxp];
int vis[maxp];
int p,l;

int dijkstra(int x)       //磁少风格版
{
    for(int i = 1 ; i <= p ; i++)
        dist[i] = INF;
    int v = x;
    dist[v]=0;
    vis[v]=1;
    for(int i = 1 ; i <= p ; i++)
    {
        for(int j = 1; j <= p ; j++)
        {
            if(vis[j]!=1 && dist[v]+edge[v][j] < dist[j])
            {
                dist[j] = dist[v] + edge[v][j];
            }

        }
        int minn = INF;
        for(int j = 1 ; j <= p ; j++)
            if(vis[j]!=1 && dist[j] < minn)
            {
                minn=dist[j];
                v=j;
            }
        vis[v]=1;
    }
}

int main()
{
    while(scanf("%d%d",&l,&p)!= EOF)
    {
        for(int i = 0 ; i < maxp ; i++)
        {
            for(int j = 0 ; j < maxp ; j++)
            {
                edge[i][j] = INF;
            }
            edge[i][i] = 0;// 因为可能输入重复两条边的值我们需要选出同样的边最小的那一个值;
        }
        CLR(vis);
        for(int i = 1 ; i <= l ; i++)
        {
            int u,v,w;
            scanf("%d %d %d",&u,&v,&w);
            if(edge[u][v] > w)
            {
                edge[u][v] = edge[v][u] = w;
            }
        }
        dijkstra(1);
        printf("%d\n",dist[p]);
    }

}

你可能感兴趣的:(POJ - 2387 Til the Cows Come Home (dijkstra模板题))