hdu1863

来源:互联网 发布:根据域名查询服务器 编辑:程序博客网 时间:2024/05/21 20:28

没有理由不对呀

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int cost[110][110];int mincost[110];bool used[110];int sett[110];int M;int prim(){  for(int i=0;i<=M;i++)  {      mincost[i]=2147483646;      used[i]=false;  }   mincost[1]=0;   int res=0;   while(true){    int v=-1;    for(int i=1;i<=M;i++) printf("%d ",mincost[i]);    for(int i=1;i<=M;i++)        if(!used[i] && (v==-1||mincost[i]<mincost[v])) v=i;    printf("v==%d\n",v);    if(v==-1) break;    used[v]=true;    res+=mincost[v];    for(int i=1;i<=M;i++)    {        mincost[i] = min(mincost[i],cost[v][i]);    }   }   return res;}int find2(int x){    while(x!=sett[x])        x=sett[x];    return x;}int main(){    int N;    while(scanf("%d%d",&N,&M)&&N){        int flag=0;        for(int i=0;i<=M;i++)  sett[i]=i;        while(N--){            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            cost[a][b]=c;            int fa = find2(a);            int fb = find2(b);            if(fa!=fb)  sett[fa]=fb;        }        int coutt=0;        for(int i=1;i<=M;i++) if(sett[i]==i) coutt++;        if(coutt > 1) flag=1;        for(int i=1;i<=M;i++)        for(int j=1;j<=M;j++)            if(cost[i][j]==0) cost[i][j]= 2147483647;        for(int i=1;i<=M;i++){        for(int j=1;j<=M;j++)            printf("%d ",cost[i][j]);            printf("\n");        }        if(flag) printf("?\n");        else printf("%d\n",prim()) ;    }    return 0;}


0 0
原创粉丝点击