社区讨论
SPFA动态数组
P1828[USACO3.2] 香甜的黄油 Sweet Butter参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mi6m1x7d
- 此快照首次捕获于
- 2025/11/20 07:05 4 个月前
- 此快照最后确认于
- 2025/11/20 07:05 4 个月前
CPP
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
int n,p,c;
int u,b[500],w[805][805],team[1601],tot,minn=99999999,dis[1601],head,tail;
//b是存牛所在的农场数;w是各个农场之间的距离, dis是u到各个点之间的最短路;
bool exist[805];
//判断该点是否在队列;
vector<int>a[805];
//动态数组邻接表;
int main()
{
cin>>n>>p>>c;
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
for(int i=0;i<=p;i++)
for(int j=0;j<=p;j++)
w[i][j]=9999999;
for(int i=1;i<=c;i++)
{
int x,y,v;
cin>>x>>y>>v;
a[x].push_back(y);
a[y].push_back(x);
w[x][y]=w[y][x]=v;//无向图;
}
for(int i=1;i<=p;i++)
{
for(int j=1;j<=p;j++)dis[j]=9999999;//每次do-while循环之后都要初始化;
memset(team,0,sizeof(team));
memset(exist,0,sizeof(exist));
dis[i]=0;team[1]=i;head=0;tail=1;exist[i]=1;
do
{
head++;
head=((head-1)%1601)+1;//循环队列
u=team[head];
exist[u]=0;
for(int j=0;j<a[u].size();j++)//用vector循环条件是<;
{
if(dis[a[u][j]]>dis[u]+w[u][a[u][j]])
{
dis[a[u][j]]=dis[u]+w[u][a[u][j]];
if(!exist[a[u][j]])
{
tail++;
tail=((tail-1)%1601)+1;//循环队列
team[tail]=a[u][j];
exist[a[u][j]]=1;
}
}
}
}while(head!=tail);
tot=0;
for(int j=1;j<=n;j++)
tot+=dis[b[j]];
if(tot<minn)minn=tot;
}
cout<<minn<<endl;
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...