• poj1797Heavy Transportation最大生成树


    题目:
    问那个人可以走完所有的城市的最大承载量是多少
    分析:
    求最大生成树的边的最小值,可以用dijkstra算法变形做,相当于把求最小值改为求最大值,
    只需把dist初始化为0,并且min处改为max = -1,注意到可能为0,再改动其他地方就行,
    详细看代码。。。

    设图由邻接矩阵g存储。
    memset(dist,0x3f,sizeof(dist));
    memset(used,false,sizeof(used));
    dist[0]=0;//设0为源点
    for(i=0;i<n;i++)//循环n次
    {
    min=10000000;
    for(j=0;j<n;j++)//找到最小值
    if(!used[j]&&dist[j]<min)
    {
    min=dist[j];
    k=j;
    }
    used[k]=true;
    for(j=0;j<n;j++)//更新其它点
    dist[j]=min(dist[j],dist[k]+g[k][j]);
    }

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    #define X 1002
    long int map[X][X],dis[X];
    bool use[X];
    int main()
    {
    freopen("sum.in","r",stdin);
    freopen("sum.out","w",stdout);
    int t,m,n,x,y,z;
    int cnt = 1;
    cin>>t;
    while(t--)
    {
    memset(map,0,sizeof(map));//初始化为0,因为求的是最大生成树中的最小值
    memset(dis,0,sizeof(dis));
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
    scanf("%d%d%d",&x,&y,&z);
    map[x][y] = map[y][x] = z;
    }
    memset(use,false,sizeof(use));//标记未经使用
    int k,MAX;
    dis[1] = 100000000;//注意此处得标记为大于10000000
    /////dijkstra模板改动一下
    for(int i=1;i<=n;i++)
    {
    MAX = -1; //此处改为最大值
    for(int j=1;j<=n;j++)
    if(!use[j]&&MAX<dis[j])//改为小于号
    MAX = dis[k=j];
    use[k] = true;
    for(int j=1;j<=n;j++)
    if(!use[j]&&dis[j]<min(dis[k],map[k][j]))//改了
    dis[j] = min(dis[k],map[k][j]);
    }
    printf("Scenario #%d:\n",cnt++);
    cout<<dis[n]<<endl;
    if(t)
    cout<<endl;
    }
    return 0;
    }

  • 相关阅读:
    Software_programming_automation_selenium
    Software_programming_EnterpriseArch_ServiceWithSingleTonFactory
    web-bootstrap-button
    Software--C#--grammer_Delegate--Event
    Software_C#_grammer_Deletegate--Strategy
    Software--BigData--StreamingData
    线程死锁和递归锁
    同步锁Lock(互斥锁)
    GIL计算python 2 和 python 3 计算密集型
    什么是python的全局解释锁(GIL)
  • 原文地址:https://www.cnblogs.com/yejinru/p/2374684.html
Copyright © 2020-2023  润新知