hdu 1863 [【最小生成树】+hdu2544【floyed】+hdu1874【dijdtra】~~~~模板复习~~~

来源:互联网 发布:js金沙娱乐190768 编辑:程序博客网 时间:2024/06/06 12:45

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863

#include<stdio.h>#include<string.h>#define inf 0x3f3f3f3f#define N 120int book[N],w[N][N],min,dis[N];int main(){    int m,n,i,j,t1,t2,t3,s,e,u,flag,sum;    while(scanf("%d%d",&m,&n),m!=0)    {        for(i = 0; i <= n; i ++)            for(j = 0; j <= n; j ++)                if(i == j)                    w[i][j] = 0;                else                    w[i][j] = inf;        for(i = 1; i <= m; i ++)        {            scanf("%d%d%d",&t1,&t2,&t3);            if(t3 < w[t1][t2])            {                w[t1][t2] = t3;                w[t2][t1] = t3;            }        }        if(m < n-1)        {            printf("?\n");            continue;        }        memset(book,0,sizeof(book));            for(i = 1; i <= n; i ++)            dis[i] = w[1][i];        book[1] = 1;        sum = 0;        for(i = 1; i < n; i ++)        {            min = inf;            for(j = 1; j <= n; j ++)            {                if(!book[j]&&dis[j] < min)                {                    u = j;                    min = dis[j];                }            }            book[u] = 1;            sum += min;            for(j = 1; j <= n; j ++)                if(!book[j]&&dis[j] > w[u][j])                    dis[j] =  w[u][j];        }        flag = 0;        for(i = 1; i <= n; i ++)            if(!book[i])            {                flag = 1;                break;            }        if(flag)            printf("?\n");        else            printf("%d\n",sum);    }    return 0;}


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


#include<stdio.h>#include<string.h>#define inf 0x3f3f3f3f#define N 110int w[N][N];int main(){    int n,m,i,j,k,t1,t2,t3;    while(scanf("%d%d",&n,&m),n!=0&&m!=0)    {        for(i = 0; i <= n; i ++)            for(j = 0; j <= n; j ++)                if(i == j)                    w[i][j] = 0;                else                    w[i][j] = inf;        for(i = 1; i <= m; i ++)        {            scanf("%d%d%d",&t1,&t2,&t3);            if(t3 < w[t1][t2])            {                w[t1][t2] = t3;                w[t2][t1] = t3;            }                    }        for(k = 1; k <= n; k ++)            for(i = 1; i <= n; i ++)                for(j = 1; j <= n; j ++)                    if(w[i][j] > w[i][k]+w[k][j])                        w[i][j] = w[i][k]+w[k][j];        printf("%d\n",w[1][n]);    }    return 0;}


题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

#include<stdio.h>#include<string.h>#define inf 0x3f3f3f3f#define N 220int book[N],w[N][N],min,dis[N];int main(){    int m,n,i,j,t1,t2,t3,s,e,u;    while(scanf("%d%d",&n,&m)!=EOF)    {        for(i = 0; i <= n; i ++)            for(j = 0; j <= n; j ++)                if(i == j)                    w[i][j] = 0;                else                    w[i][j] = inf;        for(i = 1; i <= m; i ++)        {            scanf("%d%d%d",&t1,&t2,&t3);            if(t3 < w[t1][t2])            {                w[t1][t2] = t3;                w[t2][t1] = t3;            }        }        scanf("%d%d",&s,&e);        memset(book,0,sizeof(book));            for(i = 0; i < n; i ++)            dis[i] = w[s][i];        book[s] = 1;        for(i = 1; i < n; i ++)        {            min = inf;            for(j = 0; j < n; j ++)            {                if(!book[j]&&dis[j] < min)                {                    u = j;                    min = dis[j];                }            }            book[u] = 1;            for(j = 0; j < n; j ++)                if(!book[j]&&dis[j] > dis[u]+w[u][j])                    dis[j] = dis[u] + w[u][j];        }        if(dis[e] == inf)            printf("-1\n");        else            printf("%d\n",dis[e]);    }    return 0;}

原创粉丝点击