poj 2368 Silver Cow Party
来源:互联网 发布:彩票组合软件手机软件 编辑:程序博客网 时间:2024/05/21 09:34
这道题主要是要求多个地方到一个点的最短距离,这样其实把距离反过来存到edge里就行了。逆向求
还是用dijkstra算法。
用floyd算法复杂度是n*n*n!!超时了
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;int dict[1005],bdict[1005],edge[1005][1005],bedge[1005][1005];int n,m,x;bool vis[1005];int maxx(int x,int y) { if(x > y) return x; else return y;}void dijkstra(int *dict,int x) { memset(vis,false,sizeof(vis)); dict[x] = 0;vis[x] = true; int max,k,now = x; for(int j = 1;j <= n-1;j++) { max = inf; for(int i = 1;i <= n;i++) { if(!vis[i]) { if(dict[i] > dict[now] + edge[now][i] && edge[now][i] != 0) dict[i] = dict[now] + edge[now][i]; if(max > dict[i]) max = dict[k = i]; } } now = k; vis[k] = true; } /*for(int i = 1;i <= n;i++) printf("%d ",dict[i]); printf("\n"); */}void bdijkstra(int *bdict,int x) { memset(vis,false,sizeof(vis)); bdict[x] = 0;vis[x] = true; int max,k,now = x; for(int j = 1;j <= n-1;j++) { max = inf; for(int i = 1;i <= n;i++) { if(!vis[i]) { if(bdict[i] > bdict[now] + bedge[now][i] && bedge[now][i] != 0) bdict[i] = bdict[now] + bedge[now][i]; if(max > bdict[i]) max = bdict[k = i]; } } now = k; vis[k] = true; } /*for(int i = 1;i <= n;i++) printf("%d ",bdict[i]); printf("\n");*/}int main() { scanf("%d%d%d",&n,&m,&x); int s,e,value; memset(edge,0,sizeof(edge)); memset(bedge,0,sizeof(bedge)); for(int i = 1;i <= m;i++) { scanf("%d%d%d",&s,&e,&value); if(edge[s][e] == 0 || edge[s][e] > value) edge[s][e] = value; if(bedge[e][s] == 0 || bedge[e][s] > value) bedge[e][s] = value; } memset(dict,inf,sizeof(dict)); dijkstra(dict,x); memset(bdict,inf,sizeof(bdict)); bdijkstra(bdict,x); int ans = 0; for(int i = 1;i <= n;i++) { ans = maxx(ans,dict[i]+bdict[i]); } printf("%d\n",ans);}
最后面还是贴一下floyd算法的方法吧,很简洁虽然超时了!
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;int edge[1005][1005],n,m,x;int maxx(int x,int y) { if(x > y) return x; else return y;}void floyd() { for(int i = 1;i <= n;i++)//一个点到它本身距离为0; edge[i][i] = 0; for(int k = 1;k <= n;k++) for(int i = 1;i <= n;i++) for(int j = 1;j <= n;j++) if(edge[i][k] != inf && edge[k][j] != inf && edge[i][k] + edge[k][j] < edge[i][j]) edge[i][j] = edge[i][k] + edge[k][j];}int main() { scanf("%d%d%d",&n,&m,&x); int s,e,value; memset(edge,inf,sizeof(edge)); for(int i = 1;i <= m;i++) { scanf("%d%d%d",&s,&e,&value); if(edge[s][e] > value) edge[s][e] = value; } floyd(); /*for(int i = 1;i <= n;i++) { for(int j = 1;j <= n;j++) printf("%d ",edge[i][j]); printf("\n"); }*/ int ans = 0; for(int i = 1;i <= n;i++) ans = maxx(ans,edge[i][x]+edge[x][i]); printf("%d\n",ans);}
0 0
- poj 2368 Silver Cow Party
- poj Silver Cow Party
- poj Silver Cow Party
- Silver Cow Party POJ
- Silver Cow Party POJ
- Silver Cow Party POJ
- Silver Cow Party POJ
- POJ Silver Cow Party
- Silver Cow Party POJ
- Silver Cow Party POJ
- poj 3268 Silver Cow Party
- POJ 3268 Silver Cow Party
- poj 3268 Silver Cow Party
- POJ 3268 Silver Cow Party
- POJ 3268 Silver Cow Party
- POJ-3268-Silver Cow Party
- poj 3268 Silver Cow Party
- poj 3268 Silver Cow Party
- Github
- 支付宝问题
- Android TV 智能电视/盒子 APP 开发焦点控制 两种方法实例
- 如何使用微软提供的TCHAR.H头文件
- XLPagerTabStrip
- poj 2368 Silver Cow Party
- document.form.action,表单分向提交
- TCHAR与_TCHAR有哪些不同?
- python - datetime时间相加
- myeclipse9编辑jsp时卡慢现象
- 经典问题之01与完全背包总结
- fragment 懒加载
- UVa1625 Color Length(DP)
- tomcat性能调优和性能监控(visualvm)