您的位置:首页 > 其它

poj 3268 Silver Cow Party(最短路)

2014-04-18 12:59 387 查看
题意是牛去参加party,求有向图来去最短的路径长度。

热身赛的时候知道这是最短路,但是做不出来。

卡在:不知道是有向图;知道是有向图之后,不知道回的时候怎么处理。

回的时候处理:把图的邻接矩阵反过来。

见图:



可以知道,把点2当成起点,第一次找到一条最短路,然后将路径逆过来,第二次可以再找到一条最短路。

代码中有一个注意点,实参数组输入函数的时候,size会成实际的大小,而不是原来开的那个数组的大小。

代码:
#include <stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

int N, M, X;
int farm[1001][1001], disgo[1001], disback[1001];
bool vis[1001];

void dijkstra(int dis[])
{
memset(vis, false, sizeof(vis));
memset(dis, 0x3f, sizeof(disgo));

//!!debug printf("%d %d\n", sizeof(dis),sizeof(disgo));

dis[X] = 0;
for(int i = 1; i <= N; i++)
{
int mark = -1, mindis = 0x3f3f3f3f;
for(int j = 1; j <= N; j++)
{
if(!vis[j] && mindis > dis[j])
{
mindis = dis[j];
mark = j;
}
}
vis[mark] = true;
for(int j = 1; j <= N; j++)
{
if(!vis[j])
dis[j] = min(dis[j], dis[mark] + farm[mark][j]);
}
}
}

int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
while(scanf("%d%d%d", &N, &M, &X)!=EOF)
{
int g, b, tmpdis;
memset(farm, 0x3f, sizeof(farm));
while(M--)
{
scanf("%d%d%d", &g, &b, &tmpdis);
farm[g][b] = tmpdis;
}

dijkstra(disgo);
for(int i = 1; i <= N; i++)
for(int j = i + 1; j <= N; j++)
swap(farm[i][j], farm[j][i]);
dijkstra(disback);

int ans = 0;
for(int i = 1; i <= N; i++)
ans = max(ans, disgo[i] + disback[i]);
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: