您的位置:首页 > 其它

USACO Section 3.2: Sweet Butter

2013-07-21 17:11 302 查看
这题我自己是用邻接矩阵+dijskstra方法来求的,第九个例子TLE。网上看了别人的代码,是用邻接表+BFS来完成。

这里可以学到两个小技巧,邻接表的表示方法和INT_MAX的表示方法。

/*
ID:yingzho1
LANG:C++
TASK:butter
*/
#include<fstream>
#include<cstring>
#include<queue>
#include <limits>
using namespace std;

ifstream fin("butter.in");
ofstream fout("butter.out");

const int MAX = 805;

struct vertex
{
int end,len;
};
vertex adj[MAX][MAX];

int cnt[MAX]={0}, cowpos[505]={0}, n, p, c;
bool pushed[MAX]={0};
int distances[MAX];

int search(int start)
{
memset(pushed, 0, sizeof(pushed));
for(int k = 1; k <= p; k++)
distances[k] = numeric_limits<int>::max();

queue<int> Q;
Q.push(start);
pushed[start] = true;
distances[start] = 0;
while(!Q.empty())
{
int x = Q.front();
Q.pop();
pushed[x] = false;
for(int j = 0; j < cnt[x]; j++)
{
if(distances[x]+adj[x][j].len < distances[adj[x][j].end])
{
distances[adj[x][j].end] = distances[x]+adj[x][j].len;
if(!pushed[adj[x][j].end])
{
Q.push(adj[x][j].end);
pushed[adj[x][j].end] = true;
}
}
}
}

int ans = 0;

for(int i = 1; i<=n; i++)
{
if(distances[cowpos[i]]==numeric_limits<int>::max()) return -1;
else  ans+=distances[cowpos[i]];
}
return ans;
}

int main()
{
memset(cnt, 0, sizeof(cnt));
fin>>n>>p>>c;
for(int i = 1; i<=n; i++)
fin>>cowpos[i];

for(int i = 1, s, t, value; i <= c; i++)
{
fin>>s>>t>>value;
adj[s][cnt[s]].end = t; adj[s][cnt[s]].len = value; cnt[s]++;
adj[t][cnt[t]].end = s; adj[t][cnt[t]].len = value; cnt[t]++;
}

int res, mins = numeric_limits<int>::max();
for(int i = 1; i <= p; i++)
{
res = search(i);
if(res < mins && res != -1) mins  =  res;
}

fout<<mins<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: