hdu 1874 畅通工程续 最短路 DIS 和 FLOYD

disjkstra 算法
View Code
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int map[205][205];
void inint(int n)
{
    int i,j;
    for(i = 0;i < n;i++)
    for(j = 0;j < n;j++)
    if(i != j)
    map[i][j] = 0x5fffffff;
    else
    map[i][j] = 0;
}//初始化~
void Dijkstra(int s,int t,int n)
{
    int vis[205] = {0};
    int i,j,val[205],pre;
    vis[s] = 1;
    for(i = 0;i < n;i++)
    val[i] = map[s][i];//初始化(感觉跟prim一样的套路= =)
    pre = s;
    int min = 0x5fffffff;
    for(i = 1;i < n;i++)//循环N-1次
    {
        min = 0x5fffffff;
        for(j = 0;j < n;j++)
        {
            if(!vis[j] && map[pre][j] != 0x5ffffff && val[j] > map[pre][j]+val[pre])//找出可以更新的值
            val[j] = val[pre] + map[pre][j];
        }
        for(j = 0;j < n;j++)
        if(min > val[j] && !vis[j])//找出最短的那一条~
        min = val[j],pre = j;
        vis[pre] = 1;
    }
    if(val[t] == 0x5fffffff)//表明不可达,,,
    printf("-1\n");
    else
    printf("%d\n",val[t]);//可达~
}
int main()
{
    int n,m,i,j,s,t,a,b,w;
    while(~scanf("%d %d",&m,&n))
    {
        inint(m);
        for(i = 0;i < n;i++)
        {
            scanf("%d %d %d",&a,&b,&w);
            if(w < map[a][b])
            map[a][b] = map[b][a] =  w;
        }
        scanf("%d %d",&s,&t);
        Dijkstra(s,t,m);
    }
    return 0;
}

floyd算法

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define max 10000*100+1
 4 int map[205][205];
 5 void inint(int n)
 6 {
 7     int i,j;
 8     for(i = 0;i < n;i++)
 9     for(j = 0;j < n;j++)
10     if(i == j)
11     map[i][j] = 0;
12     else
13     map[i][j] = max;
14 }
15 int floyd(int n,int s,int t)
16 {
17     int val[205][205];
18     int i,j,k;
19     for(i = 0;i < n;i++)
20     for(j = 0;j < n;j++)
21     val[i][j] = map[i][j];
22     for(k = 0;k < n;k++)//循环n次
23     {
24         for(i = 0;i < n;i++)
25         {
26             for(j = 0;j < n;j++)
27             {
28                 if(val[i][j] > val[i][k]+val[k][j])
29                 val[i][j] = val[i][k]+val[k][j];
30             }
31         }
32     }
33     return val[s][t];
34 }
35 int main()
36 {
37     int i,n,m,ans,a,b,s,w,t;
38     while(~scanf("%d %d",&n,&m))
39     {
40         inint(n);
41         for(i = 0;i < m;i++)
42         {
43             scanf("%d %d %d",&a,&b,&w);
44             if(w < map[a][b])
45             map[a][b] = map[b][a] = w;
46         }
47         scanf("%d %d",&s,&t);
48         ans = floyd(n,s,t);
49         if(ans >= max)
50         printf("-1\n");
51         else
52         printf("%d\n",ans);
53     }
54     return 0;
55 }
posted @ 2012-08-12 20:27  某某。  阅读(171)  评论(0编辑  收藏  举报