为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

Sgu/185

来自NOCOW
< Sgu
跳转到: 导航, 搜索
/by Logic
#include<stdio.h>
const int maxn=405,max=100000;
int n,m,l[maxn][maxn]={0},f[maxn][maxn]={0},as[maxn],adj[maxn][maxn];
int len,p[maxn][2],z[maxn][maxn]={0},zz=1;
int dijk()
{
	int i,j,dis[maxn],vis[maxn]={0},min,cur;
	dis[1]=0;
	for(i=2;i<=n;dis[i++]=max);
	for(i=1;i<=n;i++)
		{
		min=max;
		for(j=1;j<=n;j++)
			if(!vis[j]&&dis[j]<min) {min=dis[j];cur=j;}
		for(j=0;j<as[cur];j++)
			if(dis[cur]+l[cur][adj[cur][j]]<dis[adj[cur][j]])
				dis[adj[cur][j]]=dis[cur]+l[cur][adj[cur][j]];
		vis[cur]=1;
		}
	return dis[n];
}
void SPFA(int x)
{
	int i,j,qu[maxn*10],dis[maxn],vis[maxn]={0},cur,en=1;
	for(i=1;i<=n;dis[i++]=max);
	qu[0]=1;dis[1]=0;
	for(i=0;i<en;i++)
		{
		cur=qu[i];
		vis[cur]=0;
		for(j=0;j<as[cur];j++)
			if(f[cur][adj[cur][j]]>0&&dis[cur]+l[cur][adj[cur][j]]<dis[adj[cur][j]])
				{
				dis[adj[cur][j]]=dis[cur]+l[cur][adj[cur][j]];
				p[adj[cur][j]][x]=cur;
				if(!vis[adj[cur][j]])
					{vis[adj[cur][j]]=1;qu[en++]=adj[cur][j];}
				}
		}
	for(i=n;i>0;i=p[i][x])
		{
		f[i][p[i][x]]++;
		f[p[i][x]][i]--;
		if(l[p[i][x]][i]<0) {z[p[i][x]][i]=1;z[i][p[i][x]]=1;}
		l[i][p[i][x]]=0-l[p[i][x]][i];
		}
	if(dis[n]>len) zz=0;
}
void pri(int cur,int x)
{
	if(cur!=1)
		{
		if(z[p[cur][x]][cur]) x=(x+1)%2;
		pri(p[cur][x],x);
		}
	printf("%d",cur);
	if(cur!=n) printf(" ");
}
int main()
{
	freopen("data.in","r",stdin);
	freopen("data.out","w",stdout);
	int i,x,y,z;
	scanf("%d%d",&n,&m);
	for(i=0;i<m;i++)
		{
		scanf("%d%d%d",&x,&y,&z);
		l[x][y]=z;
		l[y][x]=z;
		f[x][y]=1;
		f[y][x]=1;
		adj[x][as[x]++]=y;
		adj[y][as[y]++]=x;
		}
	len=dijk();
	for(i=0;i<2;i++)
		SPFA(i);
	//for(i=1;i<=n;i++) printf("%d %d\n",p[i][0],p[i][1]);
	if(zz)
		{
		for(i=0;i<2;i++)
			{
			pri(n,i);
			printf("\n");
			}
		}
	else printf("No solution\n");
	return 0;
}
个人工具