首页 > 代码库 > shortpath1125

shortpath1125

自己AC独立通过的,不容易啊,哈哈,发现最短路、贪心还是简单的。

方法是用dijstra用了N次,其实效率与floyd比,还是差一些的。这里讲两种方法都贴上来了,重点看floyd毕竟DJ算法前面看过了:

 

你的任务将是写一个程序,告诉您选择哪一个股票经纪人作为谣言的出发点和所花费多少时间将谣言扩散到整个社会的股票经纪人。这一期限是衡量过去的人收到信息所需的时间。 

 

#include <iostream>

#include <cstdio>

#include <algorithm>

#include <queue>

using namespace std;

 

const int N = 105;

const int MAX = 0xfffffff;

 

int n;

int edge[N][N];

 

void floyd()

{

for (int k = 0; k < n; ++k)

{

for (int i = 0; i < n; ++i)

{

for (int j = 0; j < n; ++j)

{

if (edge[i][j] > edge[i][k] + edge[k][j])

{

edge[i][j] = edge[i][k] + edge[k][j];//不用设置三维数组,dk+1(i,j)

直接覆盖了//dk(i,j)

}

}

}

}

}

 

int main()

{

int m, mate, dis;

while (scanf("%d", &n) != EOF && n)

{

for (int i = 0; i < n; ++i)

{

for (int j = 0; j < n; ++j)

{

if (i != j) edge[i][j] = MAX;//初始化时,edge[i][i]0,不连通则为MAX则为MAX

else edge[i][j] = 0;

}

}

for (int i = 0; i < n; ++i)

{

scanf("%d", &m);

for (int j = 0; j < m; ++j)

{

scanf("%d%d", &mate, &dis);

--mate;

edge[i][mate] = dis;//d1(i,j)直接复制,未被赋值的全部是无限大的值,即不可达

 

}

}

floyd();

int ans, tmin, pnt;

bool disjoint;

ans = MAX;

for (int i = 0; i < n; ++i)

{

tmin = -1;

disjoint = false;

for (int j = 0; j < n && !disjoint; ++j)

{

if (i != j && edge[i][j] == MAX) disjoint = true;//如果存在IJ的路径距离仍然是MAX,说明不存在一条最短路,即两者不连通,所以存在不连通区域

if (i != j && edge[i][j] > tmin) tmin = edge[i][j];

//这里的两个i!j完全可以不要 也可以通过因为edge[i][j]=0不会被改变。

}

if (!disjoint && tmin < ans) 

{

disjoint = false;

ans = tmin;

pnt = i;

}

}

if (ans == MAX) printf("disjoint\n");

else printf("%d %d\n", pnt + 1, ans);

}

return 0;

}

 

 

 

DIJ算法:

 

 

 

#include<cstring>

#include<cstdio>

const int inf=999999; 

int map[101][101],num,d[101];

bool visit[101],flag;

 

 

int dijskra(int i)

{

int j,k,tempk,minmin,max;

memset(d,inf,sizeof(d));

memset(visit,0,sizeof(visit));

d[i]=0;

for(j=1;j<=num;j++)

{

minmin=9999;

for(k=1;k<=num;k++)

{

if(d[k]<minmin && visit[k]==0)

{

tempk=k;

minmin=d[k];

}

}

 

visit[tempk]=1;

for(k=1;k<=num;k++)

if(map[tempk][k]!=0 && d[k]>map[tempk][k]+d[tempk])

d[k]=map[tempk][k]+d[tempk];

}

 

max=-999;

for(j=1;j<=num;j++)

{

if(d[j]>max)

max=d[j];

 

if(d[j]==inf)

return -99999;

}

 

return max;

}

 

int main()

{

int i,j,temp1,temp2,n;

while(scanf("%d",&num),num)

{

memset(map,0,sizeof(map));

flag=0;

 

for(i=1;i<=num;i++)

{

scanf("%d",&n);

for(j=1;j<=n;j++)

{

scanf("%d%d",&temp1,&temp2);

map[i][temp1]=temp2;

}

}

 

int mini=9999;

 

for(i=1;i<=num;i++)

{

temp1=dijskra(i);

if(temp1<mini)

{

mini=temp1;

temp2=i;

}

}

 

if(temp1==-99999)

printf("disjoint\n");

else

 

printf("%d %d\n",temp2,mini);

}

return 1;

}