一个非常朴素的想法,能确定就关进去,不能就往后移,感觉正确性没问题,但只有60分
查看原帖
一个非常朴素的想法,能确定就关进去,不能就往后移,感觉正确性没问题,但只有60分
23248
izzxm楼主2022/4/4 11:28
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,a[20010];
struct R{int x,y,c;}r[100010];
bool cmp(R &A,R &B){return A.c>B.c;}
void swa(register int i,register int j)
{
	register int xx=r[i].x,yy=r[i].y,cc=r[i].c;
	r[i].x=r[j].x,r[i].y=r[j].y,r[i].c=r[j].c;
	r[j].x=xx,r[j].y=yy,r[j].c==cc;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(register int i=1;i<=m;i++)
    	scanf("%d%d%d",&r[i].x,&r[i].y,&r[i].c);
    if(m==1){printf("0\n");return 0;}
    sort(r+1,r+m+1,cmp);
    a[r[1].x]=1,a[r[1].y]=2;//最大的直接隔开 
    for(register int i=2;i<=m;i++)
    {
    	register int xx=r[i].x,yy=r[i].y;
    	if(a[xx]==a[yy]&&a[xx]){printf("%d\n",r[i].c);return 0;}//必冲突,直接输出 
    	if(a[xx]&&!a[yy]) a[yy]=a[xx]==1?2:1;//敌人的敌人放一起 
    	else if(!a[xx]&&a[yy]) a[xx]=a[yy]==1?2:1;
    	else if(!a[xx]&&!a[yy])//暂时都没进监狱 
		{
			register int p=i+1;
			while(!a[r[p].x]&&!a[r[p].y]&&p<=m) p++;//寻找最近的已有入狱的组合 
			if(p==m+1) a[xx]=1,a[yy]=2;//如果没有,则无所谓进哪个监狱 
			else{for(register int j=i;j<p;j++) swa(j,p);i--;}//有,则提前处理 
		}
	}
	printf("0\n");return 0;//没冲突,输出0 
}


2022/4/4 11:28
加载中...