4个多小时全部栽在这道曾经做过的题上了。。。。
最后 AC 。。真的是可以哭出来了 。。
原因 :一定要注意定义一个变量时,选择合适的位置,需要重置数据的一定记得放好位置。题目 中 name[110]的位置 是 关键。
题目:http://www.lightoj.com/volume_showproblem.php?problem=1041
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstring>
const int maxx = 100000000;
using namespace std;
int map[105][105],lc,n,sum;
int vis[105];
int dist[105];
bool prim()
{
lc=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<sum;++i)
dist[i]=map[0][i];
vis[0]=1;
int u=0;
for(int i=0;i<sum-1;++i)
{
int mins=maxx;
for(int j=0;j<sum;++j)
{
if(!vis[j]&&dist[j]<mins)
{
u=j;
mins=dist[j];
}
}
if(vis[u])
return false;
vis[u]=1;
lc+=dist[u];
for(int j=0;j<sum;++j)
{
if(dist[j]>map[u][j])
dist[j]=map[u][j];
}
}
return true;
}
int main()
{
int t,ca=1;
cin>>t;
while(t--)
{
cin>>n;
string a,b;
string name[105];
int time;
sum=0;
for(int i=0;i<105;++i)
{
for(int j=0;j<105;++j)
map[i][j]=maxx;
map[i][i]=0;
}
cin>>a>>b>>time;
name[sum++]=a;
if(b!=a)
{
name[sum++]=b;
map[0][1]=map[1][0]=time;
}
int bja,bjb;
for(int i=1;i<n;++i)
{
cin>>a>>b>>time;
int j;
for(j=0;j<sum;++j)
{
if(a==name[j])
{
bja=j;
break;
}
}
if(j==sum)
{
name[sum++]=a;
bja=j;
}
for(j=0;j<sum;++j)
{
if(b==name[j])
{
bjb=j;
break;
}
}
if(j==sum)
{
name[sum++]=b;
bjb=j;
}
map[bja][bjb]=map[bjb][bja]=min(map[bja][bjb],time);
}
//for(int i=0;i<sum;++i)
//cout<<i<<" "<<name[i]<<endl;
cout<<"Case "<<ca++<<": ";
if(prim())
cout<<lc<<endl;
else
cout<<"Impossible"<<endl;
}
}