通行线路
分层图最短路:
注意:双向变两倍空间,分层图点平方倍空间
#include<bits/stdc++.h>
using namespace std;
inline long long read(){
long long num=0;int z=1;char c=getchar();
if(c=='-') z=-1;
while((c<'0'||c>'9')&&c!='-') c=getchar();
if(c=='-') z=-1,c=getchar();
while(c>='0'&&c<='9') num=(num<<1)+(num<<3)+(c^48),c=getchar();
return z*num;
}
int n,p,k,tot;
const int N=1006,M=20006;
int d[N*N],v[N*N],head[N*M];
const int INF=0x3f3f3f3f;
struct edge{
int to,next,z;
}e[N*M];
void add(int x,int y,int z)
{
tot++;e[tot].to=y;e[tot].next=head[x];head[x]=tot;e[tot].z=z;
}
priority_queue<pair<int,int> >q;
void dijkstra()
{
memset(d,0x3f,sizeof(d));
d[1]=0;
q.push(make_pair(0,1));
while(q.size())
{
int x=q.top().second;
q.pop();
if(v[x])continue;
v[x]=1;
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].to;
if(d[y]>max(d[x],e[i].z) )
{
d[y]=max(d[x],e[i].z);
q.push(make_pair(-d[y],y));
}
}
}
}
int main(){
n=read();p=read();k=read();
for(int i=1;i<=p;i++)
{
int x=read(),y=read(),z=read();
for(int j=0;j<=k;j++)
{
add(x+j*n,y+j*n,z);
add(y+j*n,x+j*n,z);
}
for(int j=0;j<k;j++)
{
add(x+j*n,y+(j+1)*n,0);
add(y+j*n,x+(j+1)*n,0);
}
}
dijkstra();
if(d[n+k*n]==INF)cout<<"-1";
else cout<<d[n+k*n];
return 0;
}
343. 排序
传递闭包
注意:循环较多,
i
,
j
,
o
,
k
i,j,o,k
i,j,o,k等循环变量不嫩搞错
p
a
i
r
pair
pair类型注意
<
>
<>
<>中的类型
#include<bits/stdc++.h>
using namespace std;
inline long long read(){
long long num=0;int z=1;char c=getchar();
if(c=='-') z=-1;
while((c<'0'||c>'9')&&c!='-') c=getchar();
if(c=='-') z=-1,c=getchar();
while(c>='0'&&c<='9') num=(num<<1)+(num<<3)+(c^48),c=getchar();
return z*num;
}
int n,m,flag;
bool e[30][30],d[30][30];
int floyed()
{
memcpy(e,d,sizeof(e));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
e[i][j]|=e[i][k]&e[k][j];
if(e[i][j]==e[j][i]&&e[i][j]&&i!=j)return -1;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(e[i][j]==e[j][i] && !e[i][j] && i!=j )
return 0;
}
}
return 1;
}
void work()
{
memset(d,0,sizeof(d));
flag=1;
for(int i=1;i<=m;i++)
{
char s[6];
scanf("%s",s+1);
d[s[1]-'A'][s[3]-'A']=1;
if(flag)
{
int now=floyed();
if(now==1)
{
printf("Sorted sequence determined after %d relations: ", i);
pair<int,char> ans[100];
for(int j=0;j<n;j++)
{
ans[j].first=0;ans[j].second='A'+j;
}
for(int k=0;k<n;k++)
{
for(int j=0;j<n;j++)
{
if(e[k][j])ans[j].first++;
}
}
sort(ans,ans+n);
for(int k=0;k<n;k++)
{
printf("%c",ans[k].second);
}
puts(".");
flag=0;
}
else if(now==-1)
{
printf("Inconsistency found after %d relations.\n", i);
flag=0;
}
}
}
if(flag)puts("Sorted sequence cannot be determined.");
}
int main(){
while (cin >> n >> m && n) work();
return 0;
}