题解:[USACO 3.2] 香甜的黄油
2014-03-07 09:32
417 查看
/*
没啥好说的,就是相当赤多源的裸最短路
这里采用多次spfa+链表求多源
链接http://218.28.19.228/cogs/problem/problem.php?pid=309
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 810
#define INF 999999999
struct EdgeNode{
int adjvex;
int cost;
EdgeNode *next;
};
struct VexNode{
//int data;
EdgeNode *firstedge;
}g[MAXN];
int d[MAXN][MAXN];
void spfa(const int& s)
{
int rear,front,p[MAXN]={0},q[MAXN*5],j;
EdgeNode *k;
q[rear=front=1]=s;
p[s]=1;
d[s][s]=0;
while (front<=rear)
{
j=q[front];
p[j]=0;
for (k=g[j].firstedge;k;k=k->next)
if (d[s][k->adjvex]>d[s][j]+k->cost)
{
d[s][k->adjvex]=d[s][j]+k->cost;
if (!p[k->adjvex])
{
p[k->adjvex]=1;
q[++rear]=k->adjvex;
}
}
++front;
}
}
int main()
{
int i,j,n,p,c,u,v,w,cow[MAXN];
EdgeNode *s;
freopen("butter.in","r",stdin);
freopen("butter.out","w",stdout);
scanf("%d%d%d",&n,&p,&c);
for (i=0;i<n;++i)
scanf("%d",&cow[i]);
for (i=0;i<c;++i)
{
scanf("%d%d%d",&u,&v,&w);
s=(EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex=v;
s->cost=w;
s->next=g[u].firstedge;
g[u].firstedge=s;
s=(EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex=u;
s->cost=w;
s->next=g[v].firstedge;
g[v].firstedge=s;
}
/*for (i=1;i<=p;++i)
for (j=1;j<=p;++j)
d[i][j]=INF;*/
memset(d,1,sizeof(d));
int cnt,min=INF;
for (i=1;i<=p;++i)
{
spfa(i);
cnt=0;
for (j=0;j<n;++j)
{
cnt+=d[i][cow[j]];
if (cnt>min) break;
}
if (cnt<min) {
min=cnt;
}
}
printf("%d\n",min);
return 0;
}
没啥好说的,就是相当赤多源的裸最短路
这里采用多次spfa+链表求多源
链接http://218.28.19.228/cogs/problem/problem.php?pid=309
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 810
#define INF 999999999
struct EdgeNode{
int adjvex;
int cost;
EdgeNode *next;
};
struct VexNode{
//int data;
EdgeNode *firstedge;
}g[MAXN];
int d[MAXN][MAXN];
void spfa(const int& s)
{
int rear,front,p[MAXN]={0},q[MAXN*5],j;
EdgeNode *k;
q[rear=front=1]=s;
p[s]=1;
d[s][s]=0;
while (front<=rear)
{
j=q[front];
p[j]=0;
for (k=g[j].firstedge;k;k=k->next)
if (d[s][k->adjvex]>d[s][j]+k->cost)
{
d[s][k->adjvex]=d[s][j]+k->cost;
if (!p[k->adjvex])
{
p[k->adjvex]=1;
q[++rear]=k->adjvex;
}
}
++front;
}
}
int main()
{
int i,j,n,p,c,u,v,w,cow[MAXN];
EdgeNode *s;
freopen("butter.in","r",stdin);
freopen("butter.out","w",stdout);
scanf("%d%d%d",&n,&p,&c);
for (i=0;i<n;++i)
scanf("%d",&cow[i]);
for (i=0;i<c;++i)
{
scanf("%d%d%d",&u,&v,&w);
s=(EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex=v;
s->cost=w;
s->next=g[u].firstedge;
g[u].firstedge=s;
s=(EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex=u;
s->cost=w;
s->next=g[v].firstedge;
g[v].firstedge=s;
}
/*for (i=1;i<=p;++i)
for (j=1;j<=p;++j)
d[i][j]=INF;*/
memset(d,1,sizeof(d));
int cnt,min=INF;
for (i=1;i<=p;++i)
{
spfa(i);
cnt=0;
for (j=0;j<n;++j)
{
cnt+=d[i][cow[j]];
if (cnt>min) break;
}
if (cnt<min) {
min=cnt;
}
}
printf("%d\n",min);
return 0;
}
相关文章推荐
- Cogs 309. [USACO 3.2] 香甜的黄油 dijkstra,堆,最短路,floyd
- [COGS309] [USACO 3.2] 香甜的黄油
- SSL-1693 USACO 3.2 Sweet Butter 香甜的黄油 (Bellman DIJ SPFA)
- [USACO3.2]香甜的黄油 Sweet Butter
- USACO 3.2 Sweet Butter 香甜的黄油 (Bellman DIJ SPFA)
- USACO 香甜的黄油
- Cpp环境【Usaco 3.2.6】【Vijos1251】Павлов的香甜黄油
- 【USACO3.2.6】香甜的黄油
- 【USACO题库】3.2.6 Sweet Butter香甜的黄油
- [Usaco-3.2.6] Sweet Butter香甜的黄油
- 【USACO 3.2.6】香甜的黄油
- JZOJ1287.【USACO题库】3.2.6 Sweet Butter香甜的黄油
- USACO 3.2 Magic Squares (msquares) 题解
- 【USACO3.2.6】香甜的黄油 最短路径
- USACO - 3.2.6 Sweet Butter 香甜的黄油 Dijkstra(迪杰斯特拉算法)+枚举
- 【USACO题库】3.2.6 Sweet Butter香甜的黄油
- (1070): 【USACO TRAINING】香甜的黄油
- USACO3.2.6 香甜的黄油 (SPFA)
- USACO3.2.6 香甜的黄油 解题报告
- USACO 3.2 butter 最短路