我从dp的题目里翻出这道题,发现是求最短路径。用的是dijkstra算法,听说数据很水,用floyd算法应该更简洁,这两个算法都应该有dp的思路吧,可是floyd我还不会啊。好忧伤
#include<iostream>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int lowcost[105];
int map[105][105];
int n;
int who;
int dijkstra(int v0)
{
int i,j,k;
bool flag[105];
memset(flag,0,sizeof(flag));
flag[v0]=1;
for(i=1;i<=n;i++)//初始化
lowcost[i]=map[v0][i];
int minn=inf;
int v;
for(k=1;k<n;k++)
{
minn=inf;
for(i=1;i<=n;i++)
{
if(minn>lowcost[i]&&flag[i]==0)
{
v=i;
minn=lowcost[i];
}
}
if(minn!=inf)
{
flag[v]=1;
for(j=1;j<=n;j++)
{
if(flag[j]==0&&lowcost[v]+map[v][j]<lowcost[j])
{
lowcost[j]=lowcost[v]+map[v][j];
}
}
}
else
{
return inf;
}
}
int maxx=0;
for(i=1;i<=n;i++)
if(lowcost[i]!=inf&&maxx<lowcost[i])
{
maxx=lowcost[i];
}
if(maxx!=0)
return maxx;
else
return maxx;
}
int main()
{
while(cin>>n)
{
if(n==0)
break;
int i,j,k;
int x,y;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++) //一开始没有等于n,worng到爽
map[i][j]=inf;
int m;
for(i=1;i<=n;i++)
{
cin>>m;
for(j=1;j<=m;j++)
{
cin>>x>>y;
map[i][x]=y;
}
}
int mi=inf;
int tmp;
for(i=1;i<=n;i++)
{
tmp=dijkstra(i);
if(mi>tmp)
{
mi=tmp;
who=i;
}
}
if(mi==inf)
cout<<"disjoint"<<endl;
else
cout<<who<<" "<<mi<<endl;
}
return 0;
}