R7-2 Tourism Planning
#include <bits/stdc++.h>
using namespace std;
int n,m,s,d;
const int maxn=550;
int city[maxn][maxn],save[maxn],money[maxn][maxn];
int num[maxn],cnt[maxn],Mon[maxn];
int dis[maxn];
int vis[maxn]={
0};
const int inf=0x3f3f3f3f;
void dijkstra(int s)
{
int u;
for(int i=0;i<n-1;i++)
{
int minx=inf;
for(int j=0;j<n;j++)
{
if(vis[j]==0&&dis[j]<minx)
{
minx=dis[j];
u=j;
}
}
vis[u]=1;
for(int k=0;k<n;k++)
{
if(vis[k]==0&&dis[k]>dis[u]+city[u][k])
{
dis[k]=dis[u]+city[u][k];
Mon[k]=Mon[u]+money[u][k];
}
else if(vis[k]==0&&dis[k]==dis[u]+city[u][k])
{
if(Mon[k]>Mon[u]+money[u][k])
{
Mon[k]=Mon[u]+money[u][k];
}
}
}
}
}
int main()
{
cin>>n>>m>>s>>d;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
{
city[i][j]=0;
money[i][j]=0;
}
else
{
city[i][j]=inf;
money[i][j]=inf;
}
}
}
for(int i=0;i<m;i++)
{
int t1,t2,t3,t4;
cin>>t1>>t2>>t3>>t4;
city[t1][t2]=city[t2][t1]=t3;
money[t1][t2]=money[t2][t1]=t4;
}
for(int i=0;i<n;i++)
{
dis[i]=city[s][i];
}
for(int i=0;i<n;i++)
{
Mon[i]=money[s][i];
}
dijkstra(s);
cout<<dis[d]<<' '<<Mon[d];
return 0;
}
7-8 Harry Potter's exam (25 points)
Idea: The core algorithm is Freud's algorithm, that is, the multi-source shortest path problem
is calculated at the same time whether it is fully connected.
#include <bits/stdc++.h>
#define inf 1000000
using namespace std;
int mp[101][101];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
mp[i][j]=0;
else
mp[i][j]=inf;
}
}
for(int k=1;k<=m;k++)
{
int t1,t2,ll;
cin>>t1>>t2>>ll;
mp[t1][t2]=mp[t2][t1]=ll;
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(mp[i][j]>mp[i][k]+mp[k][j])
mp[i][j]=mp[i][k]+mp[k][j];
}
}
}
int index=0;
int minn=inf;
int maxx;
for(int i=1;i<=n;i++)
{
maxx=0;
for(int j=1;j<=n;j++)
{
if(maxx<=mp[i][j])
maxx=mp[i][j];
}
if(minn>maxx)
{
minn=maxx;
index=i;
}
}
if(index==0)
cout<<"0"<<endl;
else
cout<<index<<' '<<minn;
return 0;
}
L2-001 Emergency Rescue (25 points)
#include <bits/stdc++.h>
using namespace std;
int n,m,s,d;
const int maxn=550;
int city[maxn][maxn],save[maxn];
int num[maxn],cnt[maxn],pre[maxn];
int dis[maxn];
int vis[maxn]={
0};
const int inf=0x3f3f3f3f;
void dijkstra(int s)
{
int u;
num[s]=1;
cnt[s]=save[s];
for(int i=0;i<n-1;i++)
{
int minx=inf;
for(int j=0;j<n;j++)
{
if(vis[j]==0&&dis[j]<minx)
{
minx=dis[j];
u=j;
}
}
vis[u]=1;
for(int k=0;k<n;k++)
{
if(vis[k]==0&&dis[k]>dis[u]+city[u][k])
{
dis[k]=dis[u]+city[u][k];
num[k]=num[u];
cnt[k]=save[k]+cnt[u];
pre[k]=u;
}
else if(vis[k]==0&&dis[k]==dis[u]+city[u][k])
{
num[k]=num[u]+num[k];
if(cnt[u]+save[k]>cnt[k])
{
cnt[k]=save[k]+cnt[u];
pre[k]=u;
}
}
}
}
}
void dfs(int v)
{
if(s==v)
{
cout<<s;
return;
}
else
{
dfs(pre[v]);
cout<<' '<<v;
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m>>s>>d;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)
city[i][j]=0;
else
city[i][j]=inf;
}
}
for(int i=0;i<n;i++)
cin>>save[i];
for(int i=0;i<m;i++)
{
int t1,t2,t3;
cin>>t1>>t2>>t3;
city[t1][t2]=city[t2][t1]=t3;
}
dis[s]=0;
for(int i=1;i<n;i++)
{
dis[i]=inf;
}
dijkstra(s);
cout<<num[d]<<' '<<cnt[d]<<endl;
dfs(d);
return 0;
}