读书人

杭电1102解决思路

发布时间: 2012-07-31 12:33:46 作者: rapoo

杭电1102
菜鸟求助:杭电1102题。http://acm.hdu.edu.cn/showproblem.php?pid=1102
我做过好多次测试了,好像都没有发现什么问题,但是交了几次都是WA。希望各位大佬能帮帮忙啊。

C/C++ code
#include <stdio.h>#include<iostream>#include <set>#include <list>using namespace std;//1102int nPath[100][100];int main(){    list<set<int> > setlist;    set<int> tmpset,tmpset1;    int nVillage,nTmp1,nTmp2;    int i,j,nRes=0;    bool bTag;    list<set<int> >::iterator it;    set<int>::iterator itset;    while(scanf("%d",&nVillage)!=EOF){    for(i=0;i<nVillage;i++)        for(j=0;j<nVillage;j++)            scanf("%d",&nPath[i][j]);    scanf("%d",&i);    for (j=0;j<i;j++)    {        scanf("%d%d",&nTmp1,&nTmp2);        bTag = false;        for ( it = setlist.begin();it!=setlist.end();++it)        {            tmpset = *it;            for (itset = tmpset.begin();itset!=tmpset.end();++itset)            {                if (*itset == nTmp1-1)                {                    it->insert(nTmp2-1);                    nRes += nPath[*itset][nTmp2-1];                    bTag = true;                    break;                }                else if ( *itset == nTmp2-1)                {                    it->insert(nTmp1-1);                    nRes+= nPath[*itset][nTmp1-1];                    bTag = true;                    break;                }            }            if (bTag)            {                break;            }        }        if (it == setlist.end())        {            tmpset.clear();            tmpset.insert(nTmp1-1);            tmpset.insert(nTmp2-1);            setlist.push_back(tmpset);        }    }    for (i=0;i<nVillage;i++)    {        bTag = false;        for ( it = setlist.begin();it!=setlist.end();++it)        {            tmpset = *it;            for (itset = tmpset.begin();itset!=tmpset.end();++itset)            {                if (*itset==i)                {                    bTag=true;                    break;                }            }            if (bTag)            {                break;            }        }        if (it == setlist.end())        {            if (nPath[i][0]!=0)            {                nTmp1 = nPath[i][0];            }            else                nTmp1 = nPath[i][1];                        for(j=0;j<nVillage;j++)            {                if (nPath[i][j]!=0 && nPath[i][j]<nTmp1)                {                    nTmp1 = nPath[i][j];                    nTmp2 = j;                }            }            //search for j            bTag = false;            for ( it = setlist.begin();it!=setlist.end();++it)            {                tmpset = *it;                for (itset = tmpset.begin();itset!=tmpset.end();++itset)                {                    if (*itset==nTmp2)                    {                        bTag=true;                        break;                    }                }                if (bTag)                {                    break;                }            }            if (bTag==false)            {//no                tmpset.insert(i);                tmpset.insert(nTmp2);                nRes += nPath[i][nTmp2];                setlist.push_back(tmpset);            }            else            {//yes                it->insert(i);                nRes += nPath[nTmp2][i];            }        }    }    while (setlist.size()!=1)    {        tmpset = setlist.back();        setlist.pop_back();        it = setlist.begin();        set<int>::iterator itset2 = (*it).begin();        itset=tmpset.begin();        nTmp1 = nPath[*itset2][*itset];        //nTmp1 as mimi value        for (;itset2!=(*it).end();++itset2)        {            for (itset=tmpset.begin();itset!=tmpset.end();++itset)            {                if (nPath[*itset2][*itset]<nTmp1)                {                    nTmp1 = nPath[*itset2][*itset];                }            }        }        nRes += nTmp1;        it = setlist.begin();        it->insert(tmpset.begin(),tmpset.end());    }    printf("%d\n",nRes);    setlist.clear();    nRes = 0;    }    return 0;} 



[解决办法]
这地方插入的时候是不是不需要计算nRes??
C/C++ code
                if (*itset == nTmp1-1)                {                    it->insert(nTmp2-1);                    nRes += nPath[*itset][nTmp2-1];//?????                    bTag = true;                    break;                }                else if ( *itset == nTmp2-1)                {                    it->insert(nTmp1-1);                    nRes+= nPath[*itset][nTmp1-1];//???????                    bTag = true;                    break;                }
[解决办法]
自己慢慢调吧,这是必须经历的过程,不然比赛的时候会更痛苦的

读书人网 >C++

热点推荐