题意:
描述: 啊啊啊啊啊啊啊!
输入:给定一个下三角矩阵,询问从1开始到其他点的最短路径中,最长的那个是多少
思路:
模板开搞!注意输入x表示无连接
dijk版:
#include <iostream>
#include <stdio.h>
#include <cstring>
#define inf 0x3f3f3f3f
#define maxn 105
using namespace std;
int mp[105][105];
char s[50];
int n;
int solve()
{
int sum=0;
for(int i=0;i<strlen(s);i++)
sum=sum*10+s[i]-'0';
return sum;
}
int vis[maxn];
int dist[maxn];
void dijk()
{
int cur=1;
for(int i=1;i<=n;i++)
{
dist[i]=mp[cur][i];
vis[i]=0;
}
vis[cur]=1;
for(int i=1;i<n;i++)
{
int index=-1,minn=inf;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dist[j]<minn)
{
minn=dist[j];
index=j;
}
}
if(index==-1)
break;
dist[index]=minn;
vis[index]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dist[j]>mp[index][j]+dist[index])
{
dist[j]=mp[index][j]+dist[index];
}
}
}
int ans=0;
for(int i=2;i<=n;i++)
{
ans=max(ans,dist[i]);
}
cout<<ans<<endl;
}
int main()
{
cin>>n;
for(int i=2;i<=n;i++)
{
for(int j=1;j<i;j++)
{
scanf("%s",s);
if(s[0]=='x')
mp[i][j]=mp[j][i]=inf;
else
mp[i][j]=mp[j][i]=solve();
}
}/*
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<mp[i][j]<<" ";;
cout<<endl;
}*/
dijk();
return 0;
}
bell-man:无优化
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <queue>
#define inf 0x3f3f3f3f
#define maxn 100005
using namespace std;
int head[maxn];
int cnt=0;
struct node
{
int u,v,w;
}edge[maxn];
void add(int u,int v,int w)
{
edge[++cnt].u=u;
edge[cnt].v=v;
edge[cnt].w=w;
}
char s[50];
int n;
int solve()
{
int sum=0;
for(int i=0;i<strlen(s);i++)
sum=sum*10+s[i]-'0';
return sum;
}
int vis[maxn];
int dist[maxn];
void bell()
{
for(int i=1;i<=n;i++)
vis[i]=0,dist[i]=inf;
vis[1]=1;
dist[1]=0;
for(int k=1;k<=n-1;k++)
{
for(int i=1;i<=cnt;i++)
{
if(dist[edge[i].v]>dist[edge[i].u]+edge[i].w)
dist[edge[i].v]=dist[edge[i].u]+edge[i].w;
}
}
int maxx=0;
for(int i=2;i<=n;i++)
{
maxx=max(maxx,dist[i]);
}
cout<<maxx<<endl;
}
int main()
{
cin>>n;
memset(head,-1,sizeof(head));
for(int i=2;i<=n;i++)
{
for(int j=1;j<i;j++)
{
scanf("%s",s);
if(s[0]!='x')
{
int len=solve();
add(i,j,len);
add(j,i,len);
}
}
}
bell();
return 0;
}
spfa:
优化版bell-man
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <queue>
#define inf 0x3f3f3f3f
#define maxn 100005
using namespace std;
int head[maxn];
int cnt=0;
struct node
{
int to,val,next;
}edge[maxn];
void add(int u,int v,int w)
{
edge[++cnt].to=v;
edge[cnt].val=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
char s[50];
int n;
int solve()
{
int sum=0;
for(int i=0;i<strlen(s);i++)
sum=sum*10+s[i]-'0';
return sum;
}
int vis[maxn];
int dist[maxn];
void spfa()
{
for(int i=1;i<=n;i++)
vis[i]=0,dist[i]=inf;
vis[1]=1;
dist[1]=0;
int cur=1;
int maxx=0;
queue<int >q;
q.push(cur);
while(!q.empty())
{
cur=q.front();
q.pop();
vis[cur]=0;
for(int i=head[cur];i!=-1;i=edge[i].next)
{
int id=edge[i].to;
if(dist[id]>edge[i].val+dist[cur])
{
dist[id]=edge[i].val+dist[cur];
if(!vis[id])
{
vis[id]=1;
q.push(id);
}
}
}
}
for(int i=2;i<=n;i++)
{
maxx=max(maxx,dist[i]);
}
cout<<maxx<<endl;
}
int main()
{
cin>>n;
memset(head,-1,sizeof(head));
for(int i=2;i<=n;i++)
{
for(int j=1;j<i;j++)
{
scanf("%s",s);
if(s[0]!='x')
{
int len=solve();
add(i,j,len);
add(j,i,len);
}
}
}
spfa();
return 0;
}