poj 3268

来源:互联网 发布:vscode theme 编辑:程序博客网 时间:2024/05/17 01:18

啊,矩阵转置好强大


#include<iostream>#include<cstring>using namespace std;int n,m,h;const int inf = 0x3f3f3f3f;int a[1003][1003];int vis[1003];int cost[1003];int sum[1003];void dijkstra(){int i,j;for(i=0;i<n;i++)cost[i]=a[h][i];vis[h]=1;for(int k=1;k<n;k++){int u=0;int minn = inf;for(i=0;i<n;i++){if(!vis[i]&&cost[i]<minn){minn=cost[i];u=i;}}vis[u]=1;for(j=0;j<n;j++){if(!vis[j]&&cost[u]+a[u][j]<cost[j])cost[j]=cost[u]+a[u][j];}}}int main(){cin>>n>>m>>h;h--;int i,j;int x,y,z;memset(a,0,sizeof(a));memset(vis,0,sizeof(vis));memset(sum,0,sizeof(sum));for(i=0;i<m;i++){cin>>x>>y>>z;x--;y--;if(!a[x][y]||a[x][y]>z)a[x][y]=z;}for(i=0;i<n;i++)for(j=0;j<n;j++)if(a[i][j]==0)a[i][j]=inf;dijkstra();//计算从x点回到其他个点的最短距离for(i=0;i<n;i++)  {sum[i]+=cost[i];}for(i=0;i<n;i++)  //进行矩阵的转置        {for(j=i+1;j<n;j++){swap(a[i][j],a[j][i]);}}memset(vis,0,sizeof(vis));dijkstra();//此时计算的是个点到x点的最点距离,很强大for(i=0;i<n;i++)sum[i]+=cost[i];int ans=0;for(i=0;i<n;i++){if(sum[i]!=2*inf)ans=max(sum[i],ans);}cout<<ans<<endl;}


0 0
原创粉丝点击